home *** CD-ROM | disk | FTP | other *** search
- ⓪ ⓪ (* -----------------------⓪#Modula Compiler /4.2c/⓪#-----------------------⓪#File mc7: Import-/Export-Behandlung⓪#⓪$26.3.85 GDOS Version⓪$30.7.85 Export/Import von Stringkonstanten gerader Laenge⓪-Import von Record-Feldern aus DefMod ins zugehoerige⓪.ImpMod nicht mehr global⓪-erster Versuch zum EnumExport-Problem⓪%7.8.85 Exportlisten optional (neuer Standard: alles qual. exportieren)⓪$19.8.85 Global-Level in DefModulen bleibt 0⓪$28.8.85 CompileTime-Absturz bei fehlender Export-Liste ausgeschlossen⓪#11.12.85 Reload beim Holen des Namens 'RUNTIME' verhindert⓪#12.12.85 in PlaTree Platzkalkulation geaendert⓪#14.12.85 Aenderung vom 12. erstmal wieder rueckgaengig gemacht⓪#22.02.86 Neuordnung der Texte⓪#23.02.86 Wert von MinInt geaendert (muss Long eingetragen sein);⓪-Relay (Kennung 0) in die ItemListe eingetragen, in PlaTree⓪-Einsetzen der Beschreibung bei Relays verhindert.⓪#14.04.86 Import von Opaques auf Umwegen in die eigene Implementation⓪-verhindert nicht mehr die Nach-Deklaration⓪#09.09.86 FROM modulname IMPORT holt Modulname mit OldId statt GetId⓪#15.10.86 Pseudo-Modul und System-Modul definiert;⓪-Importe aus System abgefragt und auf internes Modul gelenkt;⓪-nur noch fuer 9 Standardtypen werden xxxPtr eingetragen.⓪#16.10.86 Resultat Expand (Cardinal) von LongCard nach LongBoth geaendert;⓪-ImPseud importiert bei $G+ auch SystemModul komplett;⓪-Std-Funktionen MIN und MAX (Pseudo);⓪-Fehlerbehandlung bei Ueberlauf von Neubildlisten (rImpOv) jetzt⓪-in den aufrufenden Prozeduren, mit richtiger TextPos-Anzeige.⓪#21.10.86 Char-Definition mit 1 oder 2 Bytes fuer Atari/Gepard Version⓪#23.10.86 PlaTree erkennt Relay-Objekte als importiert, wenn ihr⓪-Originaleintrag importiert ist⓪#24.10.86 System-Modul auf Prozesse vorbereitet (aber noch eingeklammert);⓪-Type Process in der Item-Liste aufgenommen.⓪#25.10.86 Prozess-IDs in System freigegeben⓪#26.10.86 Korrektur der Item.Nr fuer System19;⓪-Aenderung vom 23. funktioniert jetzt (Abfrage des Import-Flags⓪-durch BTST #13)⓪#28.10.86 Korrektur der Parameter von IOTRANSFER und NEWPROCESS in System⓪$1.11.86 Aenderung vom 23.10. wieder zurueck, damit Export von⓪.Type = StandardType moeglich wird. Bei Entstehen eines Relays⓪.durch nachtraegliches Bekanntwerden des Namens im Import⓪.'erbt' der Relay die Flags des bestehenden Eintrags!⓪.(OwnItm und ImpItm).⓪$2.11.86 fuer Atari-Version 'LONG' in 'LONGWORD', 'EXPAND' in 'LONG'⓪.umgetauft.⓪$8.11.86 Typ PROCESS in System entfaellt, stattdessen Verweise auf Address⓪#24.03.87 Atari-Version: auch leere Importlisten (nur Typ/Const in Impl.)⓪.bleiben drin, damit ImplMod fuer Versionskontrolle geladen⓪.wird. (CloseImp)⓪-Atari: ausfuehrliche Key-Berechnung (CopyInf)⓪#30.03.87 Atari, CloseImp: Pseudomodul-imports nicht rausschreiben⓪#07.04.87 TT, DefMod: Key=0-Verwertung anders, neue Keyber. auch f. Gepard⓪#14.04.87 Key-Berechnung relativ zum globalen User-Id Baum⓪#16.06.87 Platzvergabe für Importphase und Baumplätten umgestellt;⓪.der freie Platz wird in festen Verhältnissen aufgeteilt⓪#19.06.87 neue Platzverteilung in InitImp⓪#26.06.87 SIZE wird Standardfunktion (statt aus SYSTEM) bei Atari⓪#14.07.87 TT, Atari,CloseImp: Auch Systemmodul-imports nicht rausschreiben⓪#22.07.87 TT, Atari: Neue System-Proc LISTEN⓪#25.10.87 Atari: neues Format der Importliste von DefMods:⓪.keine Namen der importierten Module mehr drin.⓪.Es wird immer das wirkliche Ursprungsmodul aufgeführt, auch⓪.bei importierten IDs, die (als TYPE a = B) reexportiert werden.⓪#26.10.87 Atari: BITSET = SET OF [0..15].⓪#27.10.87 DefMod: ^Modulnamen auf relAdr 22 und Namensfeld dahinter⓪.wird in DefnModule eingetragen⓪#05.11.87 OwnDef verkraftet leere Definitionsmodule⓪#16.11.87 Atari: IOCALL in System definiert⓪#17.11.87 Atari: LISTEN-Eintrag in System korrigiert -> IOCALL geht jetzt.⓪-beim Runtime-Import werden die Seriennummern geprüft und⓪-ggf. die Items-Tabelle vermurkst⓪#29.05.88 ITEMS-Tabelle: neue Beschreibung für 'Procedure', beim⓪/Importieren wird Platz für die Längen/Anf.adressen-Felder⓪/angehängt;⓪-CopInf, ImpItm verarbeiten die zusätzliche Kodierung in ITEMS⓪#28.06.88 ImpQual markiert importierte IDs richtig (Änderung vom 2.4.)⓪#29.06.88 OwnItm markiert nur noch Prozeduren, und die in Bit 12 (Extern)⓪/statt in Bit 14 (Export). BIT 14 IST FÜR LOKALEN IMPORT/EXPORT⓪/RESERVIERT!! (außer in Definitionsmodulen beim Baumplätten).⓪$2.07.88 System-Modul: Exporte als QUALIFIED markiert⓪#10.12.89 Nachtrag vom 31.03.89:⓪0DefMod: verrechnet kompletten Modulnamen im Key,⓪0wenn K+ Option~ gesetzt ist.⓪#13.12.89 Nachtrag vom 31.08.89⓪0DefMod: verrechnet nun immer kompletten Modulnamen⓪0im Key (V3.7b)⓪-Pseudo: neue Standardbezeichner⓪0VAL Std.function 9,⓪0LENGTH Std.function 10,⓪0SIZE Std.function 11,⓪0LONGREAL;⓪-System: neuer Bezeichner CAST Std.function 104,⓪0VAL und SIZE entfallen⓪#14.12.89 TT LOC in SYSTEM nachgetragen, hat z.Zt. selbe Nr., wie BYTE (38)⓪0REAL hat nur noch 4 Byte,⓪0In ITEMS-Tab LONGARRAY und LONGREAL nachgetragen⓪#18.12.89 TT neue SYSTEM-Funktionen:⓪2CADR 105, DEREF 106⓪0neue Pseudo-Funktionen:⓪2INT 12, CAP 13, CHR 14, FLOAT 15, LFLOAT 16, TRUNC 17⓪0Pseudo: Einträge 11 (PROC) und 58 (LONGREAL) vertauscht;⓪:auch 11er-Import in System-Modul angepaßt⓪8ImPseud kopiert nun auch LongReal-Pointer⓪8Paramter SHORT (LONGREAL): REAL und⓪ALONG (REAL): LONGREAL nachgetragen⓪#31.12.89 TT Pseudo: ZZ-Type neu (Kennung 4);⓪8LONG (INTEGER/CARDINAL) liefern nun LONGINT/LONGCARD⓪#09.01.90 TT Pseudo: LONG/SHORT (SBothTyp/BothTyp) hinzugefügt⓪#10.01.90 TT Pseudo: Proc wieder an alten Platz gesetzt (11), dazu LongReal⓪8und einen ABS-Parm verschoben.⓪#12.01.90 TT System: SHORT (INTEGER/CARDINAL) ergibt BYTE⓪#02.02.90 TT ImpItm16: Bei Kennung 7 (n Byte im Baum reservieren) wird der⓪0Bereich auch gleich gelöscht. Außerdem in selber Routine einige⓪0ADDQ.W #x,D6 durch ADDQ.L ersetzt⓪0ITEMS: Für Vars 2 Byte mehr reserviert (nur lokal)⓪#19.02.90 TT Pseudo: ZZ mit gesetztem Bit 15, damit es auch in Neubild-Liste⓪2kommt.⓪0Neubild: Liste wird vollst. gelöscht (bisher nur Item-Nr)⓪#27.02.90 TT Pseudo/System: BITSET nun in SYSTEM⓪#21.04.90 TT CopInf: D3 (Key) wird bei Unterbaum nicht mehr zerstört,⓪2statt Baum-Offset wird nun die Item-Nr im Key verrechnet,⓪2durch Einbeziehung der Item-Flags wird auch zw. REF/VAR/value,⓪2zw. D0-/(A3)-Rückgabe und Proc-Parm-Modus im Key unterschieden⓪#09.05.90 TT CALLSYS, CALLEXT, LOAD, STORE, CODE neu in SYSTEM, SHORTCARD⓪2SHORTINT neu in Pseudo⓪#30.06.90 TT BITSET nun mit Kennung 45 statt 5: immer neue Ordnung (unabh.⓪2von $U-Option)⓪#30.07.90 TT ITEMS: Record-Felder um einen Eintrag zum Verketten der⓪1Reihenfolge erweitert; neue Kennungen 16, 46 für Rec-Varianten.⓪#18.08.90 TT Record-Eintrag (#13) geändert: vor dem Baum und seinem Ptr⓪2steht nun der Ptr auf das 1. Element. Dadurch verschiebt⓪2sich der Ptr auf den lok. Baum um 4 Byte (von -10 auf -14).⓪#12.09.90 TT SetDef0,ImpItm16: Importierte Real-Konstanten werden ins⓪2Zielformat konvertiert, allerdings noch nicht bei ShortReals!⓪#23.09.90 TT PlaTre, CopInf: Tragen Enum-Elemente nun explizit nach.⓪0PlaTre2 trägt nur exportierte Items und die von Unterbäumen ein.⓪0NumImp entfernt unbenutze Items aus ImportListe, DefMod⓪0schiebt daraufhin geplätteten Baum runter; Rec-Variante von⓪0Kennung 16 auf 47 verlegt; Die eigenen ItemNrn von Importlisten⓪0in Def-Modulen sind auch nur noch 2 Byte statt 4 Byte groß.⓪0Werden schon bekannte IDs nochmals importiert (m/o FROM),⓪0dann werden bestehende Relays übersprungen, weil sonst doppelt⓪0verkettete Relays entstehen (ImpItm20, OwnItm).⓪0ITEMS: Proc-Type (44): Def. geändert.⓪#23.10.90 TT ImpItm16/20,ImpAll,ImpRest,FromImp,ScanItm,ListImp,ItemAdr:⓪0Kennung 7 über anonFlag eingeführt, um Gemischtimporte von⓪0Enum-Typen und ihren Elementen korrekt zu erkennen. Doku⓪0siehe GlobImp⓪#02.03.91 TT IPIMP: Importierte externe Vars werden nicht mehr in die⓪0Relozierliste aufgenommen, so daß nun die Adr erhalten bleibt.⓪#27.12.93 TT ImPseud: StrPtr ist nun identisch mit SSTyp; ITEMS: Kenn.50 neu.⓪#15.02.94 TT SETILST: Übernimmt nun wieder Modulnamen in Importliste, aber⓪0nur während compiletime, nicht ins erzeugte Defmodul.⓪0ImpXRef/IPIMP: relozierbare Items, die aus einem anderen als⓪0dem importierten Defmod stammen, werden nachträglich in die⓪0Importliste des erzeugten Impmods aufgenommen.⓪#-----------------------------------------------------⓪ *)⓪ ⓪ (*⓪!*⓪!* Langfristige Registerbelegung:⓪!*⓪!* A1 = Wurzel des ID-Baums⓪!* A2 = ^Text⓪!* A4 = ^erzeugten Code⓪!* A5 = ^Neubildlisten (bei Import)⓪!* A6 = ^Display Stack⓪!*⓪!* TOI = Top of ID-Stack⓪!*⓪!* Eine Neubildliste ist ein Feld von Longs. Der Index ist die beim Plätten⓪!* vergebene ItemNr, der Long-Wert der dazu gehörige Pointer auf die⓪!* Beschreibung im Baum.⓪!*)⓪!⓪ CONST ModNameLen = 25; (* Anzahl sign. Zeichen in ModNames *)⓪ ⓪ CONST PseudoKey = $12345679;⓪)SystemKey = $87654321;⓪ ⓪ VAR ILSTART,⓪,ILEND,⓪,AllExp,⓪(CurrentDef,⓪(CurrentKey: ADDRESS;⓪$explicitImport, (* TRUE: FROM ... IMPORT in Bearbeitung *)⓪%mustChgFormat: BOOLEAN;⓪)defFormat,⓪*anonFlag: Cardinal;⓪ ⓪2(* anonFlag = 2: gerade kopiertes Item ist anonym, auch⓪7Verweise auf Enumelemente sind anonym einzutragen.⓪5anonFlag = 7: kopiertes Item hat Namen, auch fuer⓪7Enumelemente Namenseintrag fordern *)⓪ ⓪ FORWARD ImpItm;⓪ FORWARD ImpItm1;⓪ FORWARD ImpItm16;⓪ FORWARD ImpItm20;⓪ FORWARD ImpItm30;⓪ FORWARD ListImp;⓪ FORWARD SetDef0;⓪ FORWARD CopInf;⓪ FORWARD PlaTre;⓪ FORWARD PlaTre2;⓪ FORWARD MarkExp;⓪ FORWARD NumImp;⓪ FORWARD Define;⓪ FORWARD GlobExp;⓪ FORWARD CloseImp;⓪ FORWARD OwnDef;⓪ FORWARD ImpQual;⓪ FORWARD Runtime;⓪ FORWARD ImpAll;⓪ FORWARD ImpPer;⓪ FORWARD ImpGlob;⓪ FORWARD FromImp;⓪ FORWARD ImpRest;⓪ FORWARD MyPullId;⓪ FORWARD ImpXRef;⓪ ⓪ (*⓪!* ----------------------------------⓪!* Definition Module uebersetzen⓪!* ----------------------------------⓪!*⓪!* A4 = ^erzeugten Code⓪!*⓪!*)⓪!⓪ PROCEDURE DefMod;⓪ BEGIN ASSEMBLER⓪)MOVE.B #DLAYOUT,(A4)+ ;Modul-Format⓪)MOVE.B #3,(A4)+ ;Kennung: DefMod⓪)JSR PUT2 ; 2:qual.Flag⓪)JSR PUT3 ; 4:Key⓪)JSR PUT3 ; 8:^gepl.Baum⓪)JSR PUT2 ;12:Anzahl exp. Items⓪)JSR PUT3 ;14:^Imports⓪)JSR PUT3 ;18:Platz der definierten Variablen⓪)MOVE.L A4,-(A7)⓪)JSR PUT3 ;22:^Modulname⓪)JSR PUT2 ;26:Ende d. Headers (Word!) - erst ab DLayout 6!⓪)JSR PUT2 ;28:^Sourcename (Word!)⓪)JSR PUT3 ;30:Liste der implizit zu importierenden Module⓪)⓪); Modulnamen/Ende d. Headers eintragen⓪)MOVE.L A4,D0⓪)SUB.L Header,D0⓪)MOVE.L (A7)+,A0⓪)MOVE.L D0,(A0)+ ;^Modulname⓪)MOVE.W D0,(A0)+ ;^Headerende⓪)⓪)JSR LookId ;A0 := ^ Top of ID-Stack⓪!en3 MOVE.B (A0)+,(A4)+⓪)BNE en3 ;kopieren bis Endmarke 0.B⓪)JSR put0 ;sync⓪)⓪)JSR GetSbl⓪)JSR GlobImp ;Import-Statements⓪)JSR GlobExp ;Export-Satements⓪)JSR Define ;Deklarationen⓪)CMPI.W #35,D3 ;END?⓪)BEQ OK1⓪)MOVE #rDecl,D5⓪)JMP SyntaxErr⓪ !OK1 JSR FinLblAndFwrd ;Sind alle Fwrd-Refs aufgelöst?⓪)JSR MarkExp ;Exports im Baum markieren⓪)JSR PlaTre ;gepl.Baum erstellen⓪)JSR NumImp ;Imports mit eigener ItemNr versehen⓪)CLR.L (A4)+ ;impliz. Importliste abschließen⓪)⓪); Nun geplätteten Baum und implizite Importliste⓪); zurückschieben (Offset ist in D0)⓪)MOVE.L Header,A3 ;Code-Anfang⓪)MOVE.L 8(A3),D1 ;alter ^geplaetteten Baum⓪)BEQ nomove ;keine Exportliste (dann auch keine impl. ImpLst)⓪)MOVE.L D1,A0⓪)SUB.L D0,8(A3)⓪)SUB.L D0,30(A3)⓪)ADDA.L A3,A0⓪)MOVE.L A0,A5⓪)SUBA.L D0,A0 ;neue Adr.⓪);Anfang des gepl.Baums in A5, Ende in A4, Ziel in A0⓪)SUBA.L D0,A4 ;A4 ist nun Ziel-Ende⓪ movtree MOVE.L (A5)+,(A0)+⓪)CMPA.L A4,A0⓪)BCS movtree⓪ nomove⓪)MOVE.L KEY,D0⓪ ExtKey MOVE.L IDStkBPtr,A0 ;neue Key-Berechnung: alle Namens-Bytes rein⓪)ADDQ.L #1,A0⓪ ekloop MOVE.B (A0)+,D1⓪)BEQ ekend⓪)EOR.B D1,D0⓪)ROL.L #1,D0⓪)BRA ekloop⓪ ekend TST.L D0⓪)BNE ok3⓪)MOVEQ #1,D0 ;0-Key verhindern⓪ ok3 MOVE.L Header,A0⓪)MOVE.L D0,4(A0)⓪'END⓪ END DefMod;⓪ ⓪ ⓪ (* §§§⓪ * ----------------------------------⓪ * Imports in DefModule mit deren eigener ItemNr versehen⓪ * ----------------------------------⓪ *⓪ * Bisher enthalten die Importlisten noch Ptr auf die IDs. Nun werden⓪ * daraus Item-Nrn gemacht. Nicht benutzte Items, also solche, die nicht⓪ * in der Neubildliste auftreten, werden entfernt. Der Wert, um den sich⓪ * die Liste verkürzt hat, wird in D0 geliefert.⓪ *⓪ * 15.02.94:⓪ * Wg. Alias-Prozeduren müssen ggf. die Modulnamen für implizite Importe⓪ * eingetragen werden. Dazu wird hier einfach der Name jedes Moduls erstmal⓪ * am Code (A4, hinter lin. Baum) angehängt und nur dann wieder entfernt,⓪ * wenn keine Prozedur in der Importliste übrigbleibt.⓪ *⓪ * (D0,D1,A0,A5)⓪ *⓪ * A3 = ^NeubildListe des importierenden Moduls⓪ * D5 = höchste eigene ItemNr + 1⓪ *⓪ * D0: Wert, um den die Liste kürzer geworden ist.⓪ *)⓪ PROCEDURE NumImp;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.L A4,-(A7)⓪)MOVE.L Header,A0⓪)MOVE.L A4,D0⓪)SUB.L A0,D0⓪)MOVE.L D0,30(A0) ;^implizite Importliste⓪)ADDA.L 14(A0),A0 ;^ImportListe⓪)MOVE.L A0,A5 ;^neue Importliste⓪)⓪ !NumImp4 MOVE.L (A7),A4⓪)MOVE.L (A0)+,D0⓪)MOVE.L D0,(A5)+ ;Ende der ImportListe?⓪)BEQ NumImp2 ; ja⓪)⓪)MOVE.W (A0)+,(A5)+ ;Import in DefMod: Itemanzahl kopieren⓪)⓪)MOVE.L D0,(A4)+ ;Key kopieren⓪)⓪)TST.W (A0)+ ;ist Modulname vorhanden?⓪)BNE NumImp5⓪)⓪)MOVE.B #'?',(A4)+ ;zum leichteren Debuggen dummy-Namen einfügen⓪)MOVE.B #$FF,(A4)+⓪)BRA NumImp1⓪)⓪ !NumImp5 MOVE.W (A0)+,D0 ;Modulname f. implizite Importliste kopieren⓪)MOVE.W D0,(A4)+⓪)CMP.B #$FE,D0⓪)BCS NumImp5⓪ ⓪ !NumImp1 MOVE.W (A0)+,(A5)+ ;Ende des Imports aus diesem Modul?⓪)BEQ NumImp4 ; ja⓪)MOVE.L (A0)+,D0 ;bisheriger Item-Ptr⓪)MOVE.L A3,-(A7) ;^Anfang der Neubildliste retten⓪)CLR.W D1⓪ !NumImp3 ADDQ.W #1,D1 ;Import in NeubildListe suchen⓪)CMP.L (A3)+,D0⓪)BEQ NumImp6 ;gefunden: D1 ist eigene ItemNr⓪)CMP.W D5,D1 ;alle Items durch?⓪)BCS NumImp3 ; nein, weiter⓪)⓪)SUBQ.L #2,A5 ; ja, nicht gefunden: entfernen⓪)MOVE.L (A7)+,A3⓪)BRA NumImp1⓪)⓪ !NumImp6 MOVE.W D1,(A5)+ ;eigene ItemNr eintragen⓪)MOVE.L (A7)+,A3⓪)MOVE.W -2(A1,D0.L),D0 ;Item-Kennung⓪)ANDI #$80FF,D0⓪)CMPI #$8006,D0⓪)BNE NumImp1⓪)MOVE.L A4,(A7) ;Dieses Modul bleibt in Impliziter Modulliste⓪)BRA NumImp1⓪ ⓪ NumImp2 MOVE.L A0,D0⓪)SUB.L A5,D0⓪)ADDQ.L #4,A7⓪ END⓪ END NumImp;⓪ ⓪ (*⓪!* ----------------------------------⓪!* Export-Statement:⓪!* qual/perv. Flags setzen, IDs auf ID-Stack holen⓪!* ----------------------------------⓪!*⓪!* D3 = Symbol (EXPORT falls vorhanden)⓪!*⓪!* (A0)⓪!*⓪!* D3 := folgendes Symbol⓪!* ID-Stack := exp. IDs⓪!* xpcount := Anzahl der exp. IDs⓪!* AllExp := "keine ExportListe - alles qualified exportieren"⓪!*)⓪!⓪ PROCEDURE GlobExp;⓪ BEGIN ASSEMBLER⓪*CLR.W XPCNT⓪*CMPI.W #1,D3⓪*BNE GlobExp3 ;keine Exportliste⓪*CLR.W AllExp ;also nur gelistete IDs exportieren⓪*JSR GetSbl⓪*MOVE.L Header,A0⓪*CMPI.W #64,D3 ;QUALIFIED?⓪*BNE GlobExp4⓪*MOVE.W #1,2(A0) ;qual.Flag⓪*BRA GlobExp2⓪ !GlobExp4 CMPI.W #76,D3 ;PERVASIVE?⓪*BNE GlobExp1⓪*MOVE.W #2,2(A0)⓪ !GlobExp2 JSR GetSbl⓪ !GlobExp1 TST.W D3⓪*JSR OLDID0⓪*ADDQ.W #1,XPCNT⓪*JSR GetSbl⓪*CMPI.W #10,D3 ;,⓪*BEQ GlobExp2⓪*CMPI.W #11,D3 ;;⓪*BEQ OK1⓪*MOVE #rSemXp,D5⓪*JMP SyntaxErr⓪ !OK1 JMP GetSbl⓪ !GlobExp3 MOVE.W #1,AllExp ;wir wollen alles exportieren⓪*MOVE.L Header,A0⓪*MOVE.W #1,2(A0) ; und zwar qualified⓪'END⓪ END GlobExp;⓪ ⓪ (*⓪ * ----------------------------------⓪ * Deklarationen des DefModuls uebersetzen:⓪ * IDs in ID-Baum eintragen;⓪ * Platz der deklarierten Var in Modul eintragen⓪ * ----------------------------------⓪ *⓪ * D3 = 1. Symbol⓪ *⓪ * (A0)⓪ *⓪ * D3 := folgendes Symbol (muss END sein)⓪ * VarSpc := Platzbedarf der deklarierten Variablen⓪ *)⓪ PROCEDURE Define;⓪ BEGIN⓪ ASSEMBLER⓪)CLR.L VARSPC⓪ !Define5 CMPI.W #57,D3 ;CONST⓪)BNE Define1⓪)JSR CONSDEC⓪)BRA Define5⓪ Define1 CMPI.W #58,D3 ;TYPE⓪)BNE Define2⓪)JSR TYPEDEC⓪)BRA Define5⓪ Define2 CMPI.W #56,D3 ;VAR⓪)BNE Define3⓪)JSR VARDEC⓪)BRA Define5⓪ Define3 CMPI.W #59,D3 ;PROCEDURE⓪)BNE Define4⓪)MOVE.L VARSPC,-(A7)⓪)JSR GetSbl⓪)JSR PRHEAD⓪)JSR CLRTRE ;lokale Var etc loeschen⓪)JSR PULLID⓪)SUBQ.W #1,GLOBAL ;hier kommt nix lokales⓪)MOVE.L (A7)+,VARSPC ;Var-Adr der globalen Ebene⓪)JSR GetSbl⓪)BRA Define5⓪ !Define4 MOVE.L Header,A0⓪)MOVE.L VARSPC,18(A0)⓪ END⓪ END Define;⓪ ⓪ (*⓪ * ----------------------------------⓪ * Struktur der Baumeintragungen⓪ * ----------------------------------⓪ *⓪ * Kodierung: ItemKennung {Komponente} 0⓪ * Komponenten: 1=Ptr (Item-Nr) 2=Const.L 3=Const.W 4=New_Scope 5=^ID (EnumTyp)⓪ * 6=Laengenangabe 7,n=Insert <n> Bytes, 8=^ID (EnumElem)⓪ *)⓪ PROCEDURE ITEMS;⓪ BEGIN⓪ ASSEMBLER⓪); ACHTUNG:⓪); Bei den Items 6, 17 und 50 _muß_ das 1. Feld (Adr.L) unbedingt⓪); mit ins DEF-Modul hinein, wenn es dort auch nur unnötig Platz⓪); belegt. Also dort eine '2' statt '7,4' eintragen! Denn in IPIMP⓪); wird in dieses Feld direkt ein Wert geschrieben, ohne daß dann⓪); die Bytes reserviert wären, wenn ein Insert dort angegeben wäre.⓪)DC.B 0,1,0 ;Relay⓪)DC.B 1,2,0 ;LINT⓪)DC.B 2,2,0 ;LONGREAL⓪)DC.B 3,2,0 ;CHAR⓪)DC.B 4,2,0 ;ZZ⓪)DC.B 5,2,1,0 ;SET⓪)DC.B 6,2,1,1,2,7,8,0 ;PROC⓪)DC.B 7,1,1,3,0 ;PARAM⓪)DC.B 8,2,0 ;REDECLARABLE OPAQUE⓪)DC.B 9,2,2,5,0 ;ENUM⓪)DC.B 10,3,1,8,0 ;ENUM.ELEMENT⓪)DC.B 11,2,2,2,1,0 ;SUBR⓪)DC.B 12,2,1,1,0 ;ARRAY⓪)DC.B 13,2,1,4,0 ;RECORD⓪)DC.B 14,2,1,1,0 ;REC.FELD⓪)DC.B 15,4,0 ;Lok.Module⓪)DC.B 16,4,0 ;Qualifier bei importierten Modulen⓪)DC.B 17,2,1,2,7,2,0;VAR⓪)DC.B 18,1,6,0 ;CONST alt, ohne String-Literals (s. Nr.31)⓪)DC.B 19,2,1,1,0 ;PROC.TYPE⓪)DC.B 20,2,1,0 ;PTR⓪)DC.B 21,2,0 ;WORD⓪)DC.B 22,2,0 ;LCARD⓪)DC.B 23,2,1,0 ;ADDRESS⓪)DC.B 24,2,0 ;BOOLEAN⓪)DC.B 25,2,0 ;OPAQUE⓪)DC.B 26,2,0 ;LONG⓪)DC.B 27,2,2,0 ;STRING⓪)DC.B 28,2,2,2,2,0 ;TABLE (nicht exportierbar)⓪)DC.B 29,2,2,2,3,0 ;Asm-Label (nicht exportierbar)⓪)DC.B 30,2,0 ;LBOTH⓪?;31: String-Literal (alt)⓪)DC.B 32,1,0 ;OPEN ARRAY⓪)DC.B 33,2,0 ;SINT⓪)DC.B 34,2,0 ;SCARD⓪)DC.B 35,2,0 ;SBOTH⓪)DC.B 36,3,1,0 ;StandardProc⓪)DC.B 37,1,1,1,0 ;StandardProcParams⓪)DC.B 38,2,0 ;BYTE⓪)DC.B 39,2,0 ;Signed BYTE⓪)DC.B 40,2,0 ;REAL⓪)DC.B 41,2,0 ;BITNUM⓪)DC.B 42,1,0 ;OPEN LONGARRAY⓪)DC.B 43,2,0 ;untyped/structured Constant⓪)DC.B 44,2,1,0 ;PROC.TYPE bei Parametern (8 Byte Länge)⓪)DC.B 45,2,1,0 ;SET (neue Ordnung)⓪)DC.B 46,1,2,2,1,0 ;Record-Tag⓪)DC.B 47,2,1,1,1,1,0;Rec-Variante⓪)DC.B 48,0 ;Forward-Typ⓪)DC.B 50,2,1,7,4,6,0 ;CONST neu (nun incl. String-Literals)⓪)DC.B 63,0 ;Dummy-Eintrag⓪)DC.B 0⓪)SYNC⓪ END⓪ END ITEMS;⓪ ⓪ (*⓪ * ----------------------------------⓪ * Exportierte ID's im Baum markieren⓪ * (nur benutzt, falls explizite Exportliste vorhanden ist!)⓪ * ----------------------------------⓪ *⓪ * (D0-D3)⓪ *⓪ * TOI = exportierte IDs⓪ * xpcount = Anzahl der IDs auf Stack⓪ *)⓪ PROCEDURE MarkExp;⓪ BEGIN⓪ ASSEMBLER⓪ !ML SUBQ.W #1,XPCNT⓪)BMI MarkExp1 ;keine explizite Exportliste⓪)JSR PULLID⓪)MOVE.L A0,-(A7)⓪)JSR SEARCHID ;liefert in D1 Ptr auf ggf. Relay-Eintrag⓪)MOVE.L (A7)+,A0⓪)TST.W D3⓪)BNE OK11⓪)⓪)MOVE #rExpUn,D5⓪ error JSR LoadBadID⓪)JMP SyntaxErr⓪ ⓪ !OK11 BMI OK12⓪ ⓪ !ER71 MOVE #rBdExp,D5⓪)BRA error⓪ ⓪ !OK12 BTST #13,D3 ;Import?⓪)BEQ OK⓪ ⓪)MOVE #rReExp,D5 ;ACHTUNG: auch "Type ID = importedType" wird⓪)BRA error ; hier verboten, da das ImportFlag im imp.⓪@; Eintrag gesehen wird!⓪ ⓪ !OK BSET #6,-2(A1,D1.L) ;als Exp markieren (ggf. in Relay-Eintrag)⓪)BNE dblExp ;wurde schon exportiert⓪)(* Enum-Elems werden sowieso in CopInf berücksichtigt⓪+CMPI.B #9,-1(A1,D2.L) ;Enum?⓪+BNE ML⓪+MOVE.L -14(A1,D2.L),D2⓪"MarkExp2 BSET #6,-2(A1,D2.L) ;Element exportieren⓪+BNE dblExp ;wurde schon exportiert⓪+MOVE.L -12(A1,D2.L),D2⓪+BNE MarkExp2⓪)*)⓪)BRA ML⓪ dblExp MOVE #rDblEx,D5 ;doppelter Export⓪)BRA error⓪ MarkExp1⓪ END⓪ END MarkExp;⓪ ⓪ (*⓪ * ----------------------------------⓪ * ItemNummer vergeben beim BaumPlaetten⓪ * ----------------------------------⓪ *⓪ * D1 = ^Objekt im ID-Baum, das numeriert werden soll⓪ * D5 = hoechste bisher vergebene Nr⓪ * A3 = ^Array [ItemNr] of ID-Baum-Adr⓪ * A5 = ^Array [ItemNr] of Eintrag-Status⓪ *⓪ * D0 := vergebene ItemNr⓪ *⓪ * Schluessel fuer Status-Array:⓪ * 0 fertig im PlaTree eingetragen⓪ * 2 Vorwaertsref, muss anonym eingetragen werden⓪ * 3 Vorwaertsref, muss nicht-anonym eingetragen werden⓪ *)⓪ PROCEDURE ItemNr;⓪ BEGIN⓪ ASSEMBLER⓪)TST.L D1⓪)BEQ ItemNr3 ;nil-Ptr: Sonderfall⓪)MOVE.W D5,D0⓪)BEQ ItemNr1 ;noch keine Nr vergeben⓪)SUBQ.W #1,D0⓪)MOVE.L A3,-(A7)⓪ !ItemNr2 CMP.L (A3)+,D1 ;Item in bereits numerierten suchen⓪)DBEQ D0,ItemNr2⓪)MOVE.L (A7)+,A3⓪)BNE ItemNr1 ;nicht gefunden: neue vergeben⓪)NEG.W D0 ;gefunden⓪)ADD.W D5,D0⓪)RTS⓪ !ItemNr1 ; MOVE.B #1,0(A5,D5.W) ;als 'nicht im PlaTree' markieren⓪)MOVE.B #2,0(A5,D5.W) ;!!!⓪)MOVE.W D5,D0⓪)LSL.W #2,D0⓪)MOVE.L D1,0(A3,D0.W) ;in Adr-Liste eintragen⓪)ADDQ.W #1,D5⓪)MOVE.W D5,D0⓪)RTS⓪ !ItemNr3 CLR.W D0⓪ END⓪ END ItemNr;⓪ ⓪ (*⓪ * ----------------------------------⓪ * Geplaetteten Baum erstellen⓪ * ----------------------------------⓪ *⓪ * A3: Array [ItemNr] of ID-Baum-Adressen (EvalStkPtr wird gerettet)⓪ * A5: Array [ItemNr] of boolean "Item ist eingetragen"⓪ * (A5 liegt vor A3, wichtig für Platzprüfung)⓪ *⓪ * (D0-D7,A0)⓪ *⓪ * A4 = ^wachsenden PlaTree⓪ *)⓪ ⓪ PROCEDURE PlaTre;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.L (A6),D2 ;globale ID-Baum Ebene⓪)BEQ.L PlaTre1 ; ist leer⓪)MOVE.L A4,D0 ;Abs. Adresse des gepl. Baums⓪)MOVE.L Header,A3 ;Code-Anfang⓪)SUB.L A3,D0 ;Offset zum gepl. Baum⓪)MOVE.L D0,8(A3) ;^geplaetteten Baum⓪)⓪)MOVE.L A1,D0⓪)ADD.L TreSpc,D0⓪)SUB.L A4,D0 ;Platz zwischen Codeende und Baum⓪)⓪); für jedes Item brauchen wir > 6 Byte im Code, 4 in der Liste der⓪); Basisadressen, 1 in der Flag-Liste.⓪); Wir vergeben D0/2, D0/8 * 3, D0/8. Dann läuft ggf. das Codefile⓪); zuerst über, und wir müssen nur da den Platz prüfen.⓪)⓪)LSR.L #1,D0⓪)BCLR #0,D0⓪)LEA 0(A4,D0.L),A5 ;Flags 'eingetragen'⓪)LSR.L #2,D0⓪)BCLR #0,D0⓪)LEA 0(A5,D0.L),A3 ;Liste der BasisAdr⓪)⓪)CLR.W D5 ;ItemNr.-Zaehler⓪)CLR.W D4 ;nur exportierte IDs kopieren⓪)JSR PlaTre2 ;alle exportierten Items kopieren⓪ ⓪); nun noch die benutzten, benamten & anonymen Eintraege kopieren⓪ ⓪)CLR.W D7⓪ !PlaTre8 ADDQ.W #1,D7⓪)CMP.W D5,D7⓪)BHI PlaTre7⓪)MOVE.B -1(A5,D7.W),D0;schon eingetragen?⓪)BEQ PlaTre8 ; ja⓪)⓪)CMPI.B #3,D0 ;mit Namen (nicht-anonym) nachtragen?⓪)BNE anonym ; nein⓪)⓪)MOVE.W D7,D0⓪)LSL.W #2,D0⓪)MOVE.L -4(A3,D0.W),D2 ;^ItemAdr im OriginalBaum⓪)JSR GetNameOfId ;^Namen holen⓪)TST.L D4⓪)BEQ error ;wenn EnumTyp benamt, müssen es die Elems auch⓪)⓪)MOVE.W D7,D0⓪)BSET #15,D0 ;als exportiert kennzeichnen⓪)MOVE.W D0,(A4)+ ;ItemNr -> PlaTree⓪)MOVE.L A4,A0 ;^naechsten Eintrag hier nachtragen⓪)ADDQ.L #2,A4 ;Platz f. ^next freimachen⓪ !PlaTre5 SUBQ.L #1,D4⓪)MOVE.B 0(A1,D4.L),(A4) ;Namen kopieren⓪)CMPI.B #$FE,(A4)+⓪)BCS PlaTre5 ;< $FE -> Id geht weiter⓪)BTST #0,D4 ;ungerade Adr?⓪)BNE PlaTre5 ; ja, Sync kopieren⓪)BRA cont⓪ ⓪ error MOVE #rEnuEx,D5 ;"Fehler bei Export von Enum-Elem"⓪)JMP SyntaxErr⓪ ⓪ anonym MOVE.W D7,(A4)+ ;ItemNr -> PlaTree⓪)MOVE.L A4,A0 ;^naechsten Eintrag hier nachtragen⓪)MOVE.L #$FEFF,(A4)+ ;leerer Name -> PlaTree⓪)MOVE.W D7,D0⓪)LSL.W #2,D0⓪)MOVE.L -4(A3,D0.W),D2 ;^ItemAdr im OriginalBaum⓪)MOVE D7,D0⓪ ⓪ cont JSR CopInf ;Beschreibung kopieren⓪)CMPA.L A4,A5 ;Beschreibung in Flagfeld gelaufen ?⓪)BHI PlaTre8⓪ ⓪)MOVE #rExpOv,D5 ;not enough room for Export⓪)JMP SyntaxErr⓪ ⓪ PlaTre7 CLR.W (A4)+⓪)MOVE.L Header,A0⓪)MOVE.W D5,12(A0) ;Anzahl exp. Items⓪ PlaTre1⓪ END⓪ END PlaTre;⓪ ⓪ (*;⓪ ; ----------------------------------⓪ ; ID-Baum durchsuchen und in PlaTree kopieren⓪ ; ----------------------------------⓪ ;⓪ ; (D1,A0)⓪ ;⓪ ; D2 = ^Baum-Wurzel⓪ ; D4 = "auch nicht explizit exportierte IDs kopieren"⓪ ; A4 = ^wachsenden PlaTree⓪ ;*)⓪ PROCEDURE PlaTre2;⓪ BEGIN⓪ ASSEMBLER⓪*MOVE.L D2,-(A7)⓪*MOVE.L -4(A1,D2.L),D2 ;linker Ast⓪*BEQ PlaTre3⓪*JSR PlaTre2⓪ !PlaTre3 MOVE.L (A7),D2⓪*MOVE.L -8(A1,D2.L),D2 ;rechter Ast⓪*BEQ PlaTre4⓪*JSR PlaTre2⓪ !PlaTre4 MOVE.L (A7)+,D2 ;Knoten bearbeiten⓪ ⓪*MOVE.L A4,A0 ;hier ItemNr und ^next nachtragen⓪*ADDQ.L #4,A4⓪*MOVE.W D4,-(A7) ;D4-Flag auf Stack retten⓪*MOVE.L D2,D4 ;Adr. der ID f. IDfromTree merken⓪*SUBQ.L #8,D2⓪ !PlaTre5 SUBQ.L #1,D2⓪*MOVE.B 0(A1,D2.L),(A4) ;Namen kopieren⓪*CMPI.B #$FE,(A4)+⓪*BCS PlaTre5 ;< $FE -> Id geht weiter⓪*BTST #0,D2 ;ungerade Adr?⓪*BNE PlaTre5 ; ja, Sync kopieren⓪*MOVE.W -2(A1,D2.L),D0⓪ ⓪*TST.W (A7)⓪*BNE PlaTre12 ;alles kop. (auch Importe & nicht-Exportierte)⓪*BTST #13,D0 ;importierter ID?⓪*BNE PlaTre9 ; ja, nicht übernehmen⓪*TST.W AllExp ;alles exportieren (keine Liste?)⓪*BNE PlaTre12 ; ja⓪*BTST #14,D0 ;In Exportliste?⓪*BEQ PlaTre9 ; nein, nicht übernehmen⓪ !PlaTre12⓪*BCLR #6,-2(A1,D2.L) ;ggf.Export-Flag löschen⓪*TST.B D0 ;Relay?⓪*BNE noRel⓪*MOVE.L -6(A1,D2.L),D2⓪ noRel MOVE.L D2,D1⓪*JSR ItemNr ;ItemNr zuweisen⓪*CLR.B -1(A5,D0.W) ;als fertig markieren⓪ ⓪ !PlaTre14 BSET #15,D0 ;Als exportiert markieren⓪ !PlaTre13 MOVE.W D0,(A0)+⓪*JSR CopInf ;ID-Beschreibung kopieren⓪*CMPA.L A4,A5 ;Beschreibung in Flagfeld gelaufen ?⓪*BLS noRoom⓪ PlaTre1 MOVE (A7)+,D4⓪*RTS⓪ noRoom MOVE #rExpOv,D5 ;not enough room for Export⓪*JMP SyntaxErr⓪ !PlaTre9 MOVE (A7)+,D4⓪*MOVE.L A0,A4 ;cancel begonnenen Eintrag⓪ END⓪ END PlaTre2;⓪ ⓪ (*⓪ * ----------------------------------⓪ * Beschreibung eines Baumeintrags plaetten;⓪ * nicht zustaendig fuer Kopieren des Namens!⓪ * ----------------------------------⓪ *⓪ * (D0,D2-D4,A4)⓪ *⓪ * D0 = eigene Item-Nr (für Key-Berechnung & Export-Flag)⓪ * D2 = rel. ^Beschreibung im ID-Baum⓪ * A0 = Adr zum Nachtragen des ^next Item im PlaTree⓪ * A4 = ^wachsenden PlaTree⓪ * A3 = ^Array [ItemNr] of ID-Baum Adresse⓪ *)⓪ PROCEDURE CopInf;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.L A0,-(A7) ;hier ^naechsten Eintrag nachtragen⓪)MOVE D0,-(A7) ;Export-Flag merken⓪)CMPA.L A4,A3⓪)BLS ER98 ;kein Platz mehr fuer PlaTree⓪)BRA OK⓪ !ER98 MOVE #rDefOv,D5⓪)JMP SyntaxErr⓪ ⓪);Modul-Key erstellen⓪ ⓪ !OK MOVE.L KEY,D3⓪)EXT.L D0⓪)ADD.L D0,D3 ;Key mitrechnen⓪)ROL.L #1,D3⓪)⓪)SUBQ.L #2,D2⓪)MOVEQ #0,D0⓪)MOVE.W 0(A1,D2.L),D0 ;Kennung des Eintrags⓪)MOVE.W D0,(A4)+⓪)⓪)ADD.L D0,D3 ;Key mitrechnen⓪)ROL.L #1,D3⓪)⓪)CMPI.B #31,D0⓪)BEQ.W CopInf11 ;String Const geht mal wieder anders⓪)LEA ITEMS,A0 ;Liste mit Item-Beschreibung⓪ ⓪ CopInf3 CMP.B (A0)+,D0⓪)BEQ CopInf1 ;gefunden⓪ CopInf2 TST.B (A0)+ ;nicht gefunden: Ende des Eintrags suchen⓪)BNE CopInf2⓪)TST.B (A0) ;Ende der Liste?⓪)BNE CopInf3 ; nein⓪)JSR IDfromTree⓪)MOVE #rBdExp,D5 ; ja, exp. Item ist nicht definiert⓪)JMP SyntaxErr⓪ ⓪ CopInf1 MOVE.B (A0)+,D0 ;Beschreibung kopieren⓪)BEQ.L CopInf4 ;fertig⓪)CMPI.B #1,D0 ;Ptr?⓪)BEQ CopInf10⓪)CMPI.B #5,D0 ;^ID? (Enum-Typ auf -Elems), geht wie Ptr⓪)BEQ CopInf10⓪)CMPI.B #8,D0 ;^ID? (Enum-Elem-Kette), geht wie Ptr⓪)BNE CopInf5⓪ ⓪); Pointer und ID kopieren⓪ ⓪ CopInf10 MOVE.B D0,-(A7)⓪)SUBQ.L #4,D2⓪)MOVE.L 0(A1,D2.L),D1⓪)JSR ItemNr⓪)MOVE.W D0,(A4)+⓪)EXT.L D0⓪)ADD.L D0,D3 ;Key mitrechnen⓪)ROL.L #1,D3⓪)CMPI.B #1,(A7)+ ;war es ^ID?⓪)BEQ CopInf1 ; nein, dann fertig⓪)⓪); Sonderbehandlung bei IDs (Enum-Elementen)⓪)⓪)TST.B -1(A5,D0.W) ;war sie schon mit Namen eingetragen?⓪)BEQ CopInf1 ; ja: dann ists ja schön.⓪)TST.W (A7) ;Ist Enum-Typ als exportiert markiert?⓪)BPL CopInf1 ; nein, dann nur anonym nachtragen⓪)MOVE.B #3,-1(A5,D0.W); ja: zum nicht-anonymen Nachtragen markieren⓪)BRA CopInf1⓪ ⓪ CopInf5 CMPI.B #2,D0 ;Const.L?⓪)BNE CopInf6⓪)⓪); Constant.Long kopieren⓪)⓪)SUBQ.L #4,D2⓪)MOVE.L 0(A1,D2.L),D0⓪)ADD.L D0,D3 ;Key mitrechnen⓪)ROL.L #1,D3⓪)MOVE.L D0,(A4)+⓪)BRA CopInf1⓪ ⓪ CopInf6 CMPI.B #3,D0 ;Const.W?⓪)BNE CopInf7⓪)⓪); Constant.Word kopieren⓪)⓪)SUBQ.L #2,D2⓪)MOVEQ #0,D0⓪)MOVE.W 0(A1,D2.L),D0⓪)ADD.L D0,D3 ;Key mitrechnen⓪)ROL.L #1,D3⓪)MOVE.W D0,(A4)+⓪)BRA CopInf1⓪ ⓪ CopInf7 CMPI.B #4,D0 ;Unterbaum?⓪)BNE CopInf13⓪)⓪); Unterbaum kopieren⓪);⓪); VORSICHT: Der Ptr auf den Unterbaum muß unmittelbar vor dem⓪); Baum stehen! Zwar würde CopInf hier auch mit andern Fällen⓪); klarkommen, beim Importieren würde es dann aber schiefgehen,⓪); weil dort der Baum immer direkt nach seinem Ptr abgelegt wird!⓪)⓪)SUBQ.L #4,D2⓪)MOVEM.L A0/D2,-(A7)⓪)MOVE.L 0(A1,D2.L),D2⓪)BEQ CopInf8 ;Unterbaum ist leer⓪)MOVE.L D4,-(A7)⓪)MOVEQ #1,D4 ;auch Importe und nicht exportierte IDs kopieren⓪)MOVE.L D3,KEY⓪)JSR PlaTre2⓪)MOVE.L KEY,D3⓪)MOVE.L (A7)+,D4⓪ CopInf8 CLR.W (A4)+ ;Endmarke Unterbaum⓪)MOVEM.L (A7)+,A0/D2⓪)BRA CopInf1⓪)⓪); Insert-Anweisung in der Items-Tabelle ist hier zu überspringen!⓪ ⓪ CopInf13 CMPI.B #7,D0⓪)BNE CopInf15⓪)MOVEQ #0,D0⓪)MOVE.B (A0)+,D0⓪)SUB.L D0,D2⓪)BRA CopInf1⓪)⓪); Constant mit var. Laenge kopieren⓪)⓪ CopInf15 SUBQ.L #2,D2 ;muss Konst. mit variabler Laenge sein⓪)MOVE.W 0(A1,D2.L),D0 ;Laengenangabe⓪)MOVE.W D0,(A4)+⓪ CopInf14 MOVE.L -4(A1,D2.L),D1 ;Key mitrechnen⓪)ADD.L D1,D3 ;Key mitrechnen⓪)ROL.L #1,D3⓪)MOVE.L D1,(A4)+ ;in Long-Portionen kopieren⓪)SUBQ.L #4,D2⓪)SUBQ.W #4,D0⓪)BGT CopInf14⓪)BRA CopInf1⓪ ⓪); alten String-Literal kopieren⓪ ⓪ CopInf11 CLR.W D1 ;String-Konstante⓪)MOVEQ #0,D0⓪)MOVE.B -1(A1,D2.L),D1 ;Zeichenzahl⓪ CopInf12 SUBQ.L #1,D2 ;String kopieren⓪)MOVE.B 0(A1,D2.L),D0⓪)MOVE.B D0,(A4)+⓪)ADD.L D0,D3 ;Key mitrechnen⓪)ROL.L #1,D3⓪)DBF D1,CopInf12⓪)MOVE.L A4,D0 ; SYNC A4⓪)LSR #1,D0⓪)BCC CopInf4⓪)CLR.B (A4)+⓪ ⓪); Ende der Beschreibung des Items⓪)⓪ CopInf4 ADDQ.L #2,A7⓪)MOVE.L (A7)+,A0⓪)MOVE.L A4,D0⓪)SUB.L A0,D0⓪)MOVE.W D0,(A0) ;rel. ^next nachtragen⓪)MOVE.L D3,Key⓪"END⓪ END CopInf;⓪ ⓪ (* §§§⓪ * ----------------------------------⓪ * Kopf der Importliste erstellen;⓪ * jeweils fuer EIN Import-Statement⓪ * ----------------------------------⓪ *⓪ * (D0)⓪ *⓪ * A0 = ^importiertes DefModul⓪ * A4 = ^anzulegende ImpListe⓪ * TOI = Name des DefModuls, bleibt da!⓪ *⓪ * ILstart := Startadr der Importliste⓪ * ILEnd := EndAdr der Importliste⓪ *)⓪ PROCEDURE SETILST;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.L A0,-(A7)⓪)MOVE.L A4,ILSTART⓪)MOVE.L 4(A0),(A4)+ ;Modul Key⓪)MOVE.L 4(A0),CurrentKey⓪)CMPI.W #3,IPFLAG⓪)BNE SETILST0⓪)MOVE.W 12(A0),(A4)+ ;bei Import in Def.Modul: Anz. Items⓪)MOVE.W #1,(A4)+ ;bei Defmods: Flag f. <Modulname vorhanden>⓪ SETILST0 ; Modulnamen in Importliste kopieren⓪)JSR LOOKID⓪)MOVEQ #modnamelen,D0 ;max. Char-Zahl⓪ SETILST1 MOVE.B (A0)+,(A4)+ ;Namen kopieren⓪)DBEQ D0,SETILST1⓪)SUBQ.L #1,A4⓪)MOVE.W A4,D0⓪)BTST #0,D0 ;Sync⓪)BNE SETILST2⓪)MOVE.B #$FE,(A4)+⓪ SETILST2 MOVE.B #$FF,(A4)+ ;Endmarke⓪ SETILST4 MOVE.L A4,ILEND⓪)MOVE.L (A7)+,A0⓪ END⓪ END SETILST;⓪ ⓪ (*⓪!* ----------------------------------⓪!* Neubildliste fuer Import suchen / ggf. neu erstellen⓪!* ----------------------------------⓪!*⓪!* (D0/D1)⓪!*⓪!* A5 = ^Block der Neubildlisten⓪!* D3 = Key des gesuchten Moduls⓪!* D4 = Anzahl Items (fuer Neueintrag benoetigt)⓪!* D5 = StartAdr des DefMod, für das die Liste angelegt wird⓪!* (für Platzprüfung)⓪!*⓪!* A3 := ^Anfang der Neubildliste⓪!* Zero-Flag := 'ok - kein Ueberlauf'⓪!*)⓪ ⓪ FORWARD Pseudo;⓪ FORWARD SysMod;⓪ FORWARD SysModEnd;⓪ ⓪ PROCEDURE Neubild;⓪ BEGIN⓪ ASSEMBLER⓪*CLR.L D0⓪ Neubild1 MOVE.L 0(A5,D0.L),D1 ;bestehende Liste durchsuchen: Key⓪*BEQ Neubild2 ;kein Modul mehr da⓪*CMP.L D3,D1 ; = Key des geladenen Moduls?⓪*BEQ Neubild3⓪*ADD.L 4(A5,D0.L),D0 ;^naechstes Modul⓪*BRA Neubild1⓪ Neubild2 MOVE.L D3,0(A5,D0.L) ;neue Liste: Key eintragen⓪*MOVE.W D4,D2 ;Anzahl Items⓪*MULU #6,D4 ;benoetigter Platz⓪*ADD.L #14,D4 ;Offset fuer Key/^next/items/dummy0⓪*MOVE.L D4,4(A5,D0.L)⓪*;MOVE.W D2,8(A5,D0.L)⓪*LEA 08(A5,D0.L),A3⓪*MOVE.L A3,D1 ;^Anfang der Liste merken⓪*MOVEQ #0,D0⓪ Neubild4 MOVE.W D0,(A3)+ ;alle Items undefiniert⓪*MOVE.L D0,(A3)+⓪*DBF D2,Neubild4⓪*CLR.L (A3)+ ;Endmarke⓪*CMP.L #SysModEnd,D5⓪*BHI Neubild6 ;hinter SysMod: Platzpruefung notwendig⓪*CMP.L #Pseudo,D5⓪*BCC Neubild5 ;in System oder Pseudo: keine Platzprobleme⓪ Neubild6 CMP.L A3,D5 ;sonst pruefen:⓪*BLS ImpOv ;A3 >= Adr des geladenen Moduls: Ueberlauf⓪ Neubild5 MOVEA.L D1,A3 ;^neue Liste -> A3⓪*CLR.W D0 ;setze Zero-Flag als Erfolgsmeldung⓪*RTS⓪ ImpOv MOVEQ #1,D0 ;Fehler signalisieren⓪*RTS⓪ Neubild3 LEA 08(A5,D0.L),A3 ;^bestehende Liste -> A3⓪@;zurueck mit Zero-Flag = 1⓪ END⓪ END Neubild;⓪ ⓪ (* §§§⓪ * ----------------------------------⓪ * Neubildlisten fuer Importe eines DefModuls anlegen;⓪ * in der eigenen NeubildListe CrossRef-Verweise⓪ * auf die Ursprungs-Module eintragen⓪ * ----------------------------------⓪ *⓪ * (A2: ZW fuer ^eigene Neubildliste <A3>, D0-D4)⓪ *⓪ * A0 = ^importierendes DefModul⓪ * A3 = ^dessen Neubildliste⓪ *)⓪ PROCEDURE CrosRef;⓪ BEGIN⓪ ASSEMBLER⓪)MOVEM.L A0/A2/A3,-(A7)⓪)MOVE.L A3,A2⓪)MOVE.L A0,D5 ;für Platzcheck in Neubild⓪)ADDA.L 14(A0),A0 ;^ImportListe⓪ CrosRef1 MOVE.L (A0)+,D3 ;Key⓪)BEQ CrosRef2 ; Ende der ImportListe⓪)MOVE.W (A0)+,D4 ;Anzahl Items⓪)BEQ CrosRef2 ; nix⓪)JSR Neubild ;Liste suchen/anlegen⓪)BEQ CrosRef3 ;alles ok⓪)⓪)MOVEM.L (A7)+,A0/A2/A3⓪)MOVE #rImpOv,D5 ;Fehler in Neubild: waechst in geladenes Modul!⓪)JMP SyntaxErr⓪ ⓪ CrosRef3 ; MOVE.W (A0)+,D0⓪); CMP.B #$FE,D0 ;Modulnamen bis zur Endmarke ueberspringen⓪); BCS CrosRef3⓪ ⓪ CrosRef4 MOVE.W (A0)+,D0 ;fremde ItemNr⓪)BEQ CrosRef1 ; Ende dieses Imports⓪)BCLR #15,D0 ;Var/Proc-Flag in alten Compiler-Versionen⓪)MOVE.W (A0)+,D1 ;eigene ItemNr⓪)BEQ CrosRef4 ; ist gar nicht vergeben⓪)MULU #6,D1⓪)MULU #6,D0⓪)ADD.L A3,D0 ;^Neubild im UrsprungsModul⓪)CMPI.L #$FFFF,D1 ;prüfen wg. (An,D1.W)⓪)BLS ok2⓪)TRAP #6⓪)DC.W -101 ;um internen Fehler zu melden⓪%ok2 MOVE.W #4,0(A2,D1.L) ;im importierenden Modul als CrossRef markieren⓪)MOVE.L D0,2(A2,D1.L) ;und ^Ursprung eintragen⓪)BRA CrosRef4⓪ CrosRef2 MOVEM.L (A7)+,A0/A2/A3⓪ ⓪ END⓪ END CrosRef;⓪ ⓪ (*⓪!* ----------------------------------⓪!* Definitions-Modul laden, Format pruefen⓪!* ----------------------------------⓪!*⓪!* (D0-D5)⓪!*⓪!* TOI = Modulname, bleibt da!⓪!* A4+$6000 = Lade-Adresse⓪!*⓪!* A0 := StartAdr des Moduls⓪!* Zero-Flag := "Modul gefunden"⓪!*⓪!* LOADDEF jetzt im CompIO Modul⓪!*)⓪ ⓪ (*⓪!* ----------------------------------⓪!* Definitions-Modul laden & vorbereiten (fuer normalen Import):⓪!* Importliste erzeugen,⓪!* eigene Neubildliste und CrossRefs anlegen⓪!* ----------------------------------⓪!*⓪!* (D0-D5)⓪!*⓪!* TOI = Modulname, bleibt da!⓪!* A4 = ^erzeugten Code⓪!*⓪!* A0 := ^DefModul⓪!* A3 := ^Neubildliste des DefModul⓪!* Zero-Flag := "DefMod gefunden"⓪!*)⓪ ⓪ PROCEDURE SetDef;⓪ BEGIN⓪ ASSEMBLER⓪)MOVEM.L A2/D3,-(A7)⓪)MOVE.W OLDSBL,-(A7)⓪)LEA SysName(pc),A2 ;TextPointer auf 'SYSTEM' stellen⓪)MOVE.W #1,NoReload ;Reload verhindern⓪)JSR OldId⓪)CLR.W NoReload⓪)MOVE.W (A7)+,OLDSBL⓪)MOVEM.L (A7)+,A2/D3⓪)MOVE.L A5,-(A7)⓪)JSR CheckId ;ist 'System' auf dem Stack?⓪)MOVE.L (A7)+,A5⓪)BNE normLoad⓪)LEA SysMod,A0⓪)BRA cont⓪ normLoad JSR LOADDEF ;DefModul laden, Adr in A0⓪)BNE SetDef1 ;not avail.⓪ cont JMP SetDef0⓪ SysName ACZ 'SYSTEM'⓪)SYNC⓪ SetDef1⓪ END⓪ END SetDef;⓪ ⓪ PROCEDURE SetDef0;⓪ BEGIN⓪ ASSEMBLER⓪); === Einsprung ImPseud⓪)MOVE.L A0,CurrentDef ;Adr des bearbeiteten DefMod⓪)JSR SETILST ;ImpListe auf (A4)...⓪)MOVE.L 4(A0),D3 ;Key des geladenen Moduls⓪)MOVE.W 12(A0),D4 ;Anzahl der dekl. Items⓪)SUBA.L A3,A3 ;Neubildliste erstmal auf NIL⓪)BEQ SetDef1 ; keine⓪)⓪); glob. Flag setzen, ob Real-Consts umgewandelt werden müssen⓪)CLR mustChgFormat ;defaultwert⓪)CLR D1⓪)MOVE.B 1(A0),D1 ;Enthält Modul Real-Consts?⓪)ANDI.B #$60,D1⓪)LSR #5,D1⓪)BEQ noChg ;NEIN⓪)LSR #1,D1 ;D1 enth. Format der Reals im Def-Mod⓪)MOVE UseFormat,D0⓪)CMPI #3,D0⓪)BCS retUse⓪)MOVE SysFormat,D0⓪'retUse ;D0 enth. nun Ziel-Format⓪)TST D0⓪)SNE D0⓪)ANDI #1,D0⓪)CMP D0,D1⓪)BEQ noChg⓪)MOVE #1,mustChgFormat⓪)MOVE D1,defFormat⓪'noChg⓪)⓪)MOVE.L A0,D5 ;für Platzprüfung⓪)JSR Neubild ;Neubildliste suchen/anlegen⓪)BEQ ok⓪)MOVE #rImpOv,D5 ;Fehler in Neubild: waechst in geladenes Modul!⓪)JMP SyntaxErr⓪ ok JSR CrosRef ;Neubildlisten fuer Importe dieses DefMod⓪)CLR.W D0⓪ SetDef1⓪ END⓪ END SetDef0;⓪ ⓪ (*⓪ * ----------------------------------⓪ * Importlisten vorbereiten fuer gesamten Import-Teil,⓪ * Platzverteilung bestimmen:⓪ * ----------------------------------⓪ *⓪ * A5 := ^Block der Neubild-Listen⓪ *⓪ * vorläufige Verteilung des Platzes:⓪ * je 1/8 für Code (Imp.Listen), Neubildlisten, DefModul, 5/8 für Tree⓪ *)⓪ PROCEDURE INITIMP;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.L A1,D0⓪)ADD.L TreSpc,D0 ;Untergrenze des Baums⓪)SUB.L A4,D0 ;Platz zw. Code und Baum⓪)LSR.L #3,D0⓪)BCLR #0,D0⓪)⓪)LEA 0(A4,D0.L),A5 ;^Neubild-Listen⓪)CLR.L (A5) ;Endmarke⓪)⓪)ADD.L A5,D0⓪)MOVE.L D0,DAdr ;dahin DefModul laden (für LoadDef)⓪ END⓪ END INITIMP;⓪ ⓪ ⓪ (*⓪!* ----------------------------------⓪!* Pseudomodul importieren:⓪!* Standardtypen in ID-Baum und TypListe eintragen;⓪!* wenn G+ gesetzt, auch SystemModul importieren⓪!* ----------------------------------⓪!*⓪!* (A0,A3,D0-D4)⓪!*)⓪ PROCEDURE ImPseud;⓪ BEGIN⓪ ASSEMBLER⓪); Leernamen auf ID-Stack⓪)MOVE.L A2,-(A7)⓪)LEA empty(PC),A2⓪)JSR PushID⓪)MOVE.L (A7)+,A2⓪)⓪)MOVE.W D3,-(A7)⓪)MOVE.L Options,D0⓪)BTST #7,D0 ;Gepard-Standard?⓪)BEQ noGep ;noe⓪)LEA SysMod,A0 ;*** Systemmodul pervasive importieren:⓪)JSR SetDef0 ;Neubildliste eintragen⓪)MOVE.W #$FFFF,PERVIMP⓪)JSR ImpAll ;Import pervasive⓪ noGep LEA Pseudo,A0 ;*** PseudoModul pervasive importieren:⓪)JSR SetDef0 ;Neubildliste eintragen⓪)MOVE.W #$FFFF,PERVIMP⓪)JSR ImpAll ;Import pervasive⓪)LEA INTPTR,A0⓪)ADDQ.L #6,A3⓪)MOVEQ #18,D0 ;Anzahl der Std-Types minus Eins⓪ ImPseud1 ADDQ.L #2,A3⓪)MOVE.L (A3)+,(A0)+ ;^Standard-Typen kopieren⓪)DBF D0,ImPseud1⓪)MOVE.L SSTyp,StrPtr⓪)MOVE.W (A7)+,D3⓪)JMP MyPullID ;Name wieder von Stack holen⓪ empty: DC.W 0⓪ END⓪ END ImPseud;⓪ ⓪ (*⓪!* ----------------------------------⓪!* Baumeintragungen und Importlisten anlegen⓪!* ----------------------------------⓪!*)⓪ PROCEDURE InitImports;⓪"BEGIN⓪$ASSEMBLER⓪(JSR INITIMP ;Neubildlisten vorbereiten⓪(MOVE.L A4,D0 ;bei Pgm/DefMod:⓪(MOVE.L Header,A0⓪(SUB.L A0,D0⓪(MOVE.L D0,14(A0) ;^ImportListe anlegen⓪(JSR ImPseud⓪(; Nun sind CardRel/IntRel init. -> $I-Option kann ausgewertet werden:⓪(JSR validateOpts⓪$END⓪"END InitImports;⓪ ⓪ (*⓪ * ----------------------------------⓪ * Import-Statements uebersetzen⓪ * ----------------------------------⓪ *⓪ * (D0-D5,A0)⓪ *⓪ * D3 = 1. Symbol (IMPORT/FROM, falls vorhanden)⓪ *⓪ * D3 := Symbol nach ';'⓪ * A3 := Platzbedarf der imp. Variablen⓪ *⓪ * Um die Probleme mit Enums zu lösen, wird nun wie folgt vorgegangen:⓪ * (TT 22.10.90)⓪ *⓪ * 1. Wenn alles importiert wird (also ohne FROM, über 'ImpAll'), werden⓪ * ja auch alle vorhandenen IDs durchgegangen, sodaß auch die Enum-Elems⓪ * in der "Importliste" vorkommen. Daher ist es dann egal, ob die⓪ * Enum-Elems anonym oder benamt nachgefordert werden, wenn der Typ⓪ * zuerst dran kommt: Irgendwann kommen die Elems nach und werden mit⓪ * Namen nachgetragen. Daher wäre der Wert in "anonFlag" bei 'ImpAll' egal.⓪ * Damit es aber erst gar nicht bei Import von Strukturen, die wiederum⓪ * Enum-Typen aus anderen Modulen benutzen, evtl. zu benamten Importen⓪ * kommt, ist "anonFlag" generell 2 (anonyme Eintragung von Enum-Elems).⓪ * 2. Wenn einzeln über FROM importiert wird, ist eine Unterscheidung zw.⓪ * Enum-Typ und -Elem zu treffen: Wird ein Enum-Typ importiert, müssen⓪ * die Namen der Elems unbedingt nachgefordert werden (Kennung 7 bei⓪ * ItemAdr). Wird ein Enum-Elem importiert, müssen dagegen die Verweise⓪ * auf die ggf. weiteren Elems anonym nachgetragen werden.⓪ * Die Var 'explicitImport' wird bei FROM ... IMPORT auf TRUE gesetzt,⓪ * um den 2. Fall zu erkennen (in ImpItm16 und ScanItm).⓪ * Die Kennung 3 in der Neubildliste kommt nur noch bei Enum-Elems vor, bei⓪ * denen der Enum-Typ mit FROM importiert wurde. So werden mit dieser Kennung⓪ * praktisch explizite FROM-Importe der Elems simuliert. Wenn diese Kennung 3⓪ * mit einem weiteren expliziten Import kollidiert, ist dies ein Fehler wg.⓪ * Doppel-Imports eines Enum-Elems.⓪ *)⓪ ⓪ PROCEDURE GlobImp;⓪ BEGIN⓪ ASSEMBLER⓪)JSR InitImports⓪)CMPI.W #3,IPFLAG ;DefMod?⓪)BEQ GlobImp6⓪)MOVE.L OPTIONS,D1⓪)BTST #14,D1⓪)BNE GlobImp6⓪)JSR Runtime ; weder noch: Runtime importieren⓪ GlobImp6 CMPI.W #69,D3 ;IMPORT?⓪)BNE GlobImp7⓪ GlobImp5 JSR GETID ;* IMPORT modulname *⓪)JSR SetDef ;DefModul laden & vorbereiten⓪)BEQ OK⓪)MOVE #rNoDef,D5 ;nicht gefunden⓪)JMP SyntaxErr⓪ !OK MOVE.W 2(A0),D1⓪)CMPI.W #1,D1 ;ist Export qualified?⓪)BNE GlobImp2⓪)JSR ImpQual ; ja⓪)BRA GlobImp3⓪ GlobImp2 CMPI.W #2,D1 ;ist Export pervasive?⓪)BNE GlobImp4⓪)JSR ImpPer ; ja⓪)BRA GlobImp3⓪ GlobImp4 JSR ImpGlob ;unqualified Export⓪ GlobImp3 JSR GetSbl⓪)CMPI.W #10,D3 ;',' ?⓪)BEQ GlobImp5 ;weitere ModulNamen⓪)CMPI.W #11,D3⓪)BEQ OK1⓪)MOVE #rSemXp,D5 ;muss ';' folgen⓪)JMP SyntaxErr⓪ !OK1 JSR GetSbl⓪)BRA GlobImp6⓪ GlobImp7 CMPI.W #68,D3 ;FROM?⓪)BNE.W GlobImp1⓪)JSR OLDID ;* FROM modulname IMPORT *⓪)JSR GetSbl⓪)CMPI.W #69,D3 ;IMPORT?⓪)BEQ OK2⓪)MOVE #rImpXp,D5 ; muss folgen⓪)JMP SyntaxErr⓪ !OK2 JSR SetDef ;laden & vorbereiten⓪)BEQ OK10⓪)MOVE #rNoDef,D5 ;nicht gefunden⓪)JMP SyntaxErr⓪ !OK10 JSR MyPullId⓪)CLR.W PERVIMP⓪ GlobImp8 JSR FromImp ;einen ID importieren⓪)MOVE.L A0,-(A7)⓪)JSR GetSbl⓪)MOVE.L (A7)+,A0⓪)CMPI.W #10,D3 ;,⓪)BEQ GlobImp8 ;weitere IDs⓪)CMPI.W #11,D3 ;;⓪)BEQ OK3⓪)MOVE #rSemXp,D5⓪)JMP SyntaxErr⓪ !OK3 MOVE.L A0,-(A7)⓪)ADDA.L 8(A0),A0⓪)JSR ImpRest ;Refs auf anonym benutzte Items nachtragen⓪)JSR CloseImp ;ImpListe: wenn leer: loeschen, sonst Endmarke⓪)MOVE.L (A7)+,A0⓪)JSR ImpXRef⓪)JSR GetSbl⓪)BRA GlobImp6⓪ GlobImp1 CLR.L (A4)+ ;Endmarke ImportListen⓪)CMPI.W #2,IPFLAG ;Impl.Mod?⓪)BNE L1⓪)JMP OwnDef ;eigenes DefModul laden⓪ !L1 CLR.L VARSPC ;kein verbrauchter Var-Platz⓪ END⓪ END GlobImp;⓪ ⓪ (*⓪$----------------------------------⓪$Import Runtime (pervasive)⓪ ⓪$prüft nebenbei die Seriennummern, die auf dem IntegerStack stehen.⓪$Im Fall eines Fehlers wird die Item-Tabelle zerschossen.⓪$----------------------------------⓪ ⓪((D0-D2,D4,D5,A0)⓪ *)⓪ PROCEDURE Runtime;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.W D3,-(A7)⓪)MOVE.W OLDSBL,-(A7)⓪)JSR PullInt ;schon mal eine Seriennummer holen⓪)MOVE.W D0,-(A7)⓪)MOVE.L A2,-(A7)⓪)LEA rtName(pc),A2 ;TextPointer auf 'Runtime' stellen⓪)MOVE.W #1,NoReload ;Reload verhindern⓪)JSR GETID⓪)CLR.W NoReload⓪)MOVE.L (A7)+,A2⓪)JSR LOADDEF ;Laden, vorbereiten⓪)BEQ OK⓪)MOVE #rRuDef,D5 ;Runtime Mod not found⓪)JMP SyntaxErr⓪ rtName ACZ 'Runtime'⓪)SYNC⓪ OK JSR SetDef0⓪)JSR ImpPer ;pervasive importieren⓪)⓪); Prüfung der Seriennummer⓪)⓪)JSR PullInt ;das ist die Original-Seriennummer⓪)MOVE #SerCnt2,D1⓪ lp BTST #3,D0 ;17 bit Schieberegister, rechtsrum⓪)BEQ noChng ;bit17 (i+1) := bit0 (i) EOR bit3 (i)⓪)BCHG #0,D0⓪ noChng ASR.L #1,D0⓪)BCC zero⓪)BSET #16,D0⓪ zero DBF D1,lp⓪)ADDI.W #SerOffset2,D0⓪)CMP.W (A7)+,D0⓪)BEQ SerOk⓪)LEA Items,A0⓪)SUBQ.B #2,3(A0)⓪ SerOk MOVE.W (A7)+,OLDSBL⓪)MOVE.W (A7)+,D3⓪ END⓪ END Runtime;⓪ ⓪ (*⓪ * ----------------------------------⓪ * PullID, ohne A0 zu stoeren⓪ * ----------------------------------⓪ *⓪ * (D0)⓪ *)⓪ PROCEDURE MyPullId;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.L A0,-(A7)⓪)JSR PULLID⓪)MOVE.L (A7)+,A0⓪ END⓪ END MyPullId;⓪ ⓪ (*⓪ * ----------------------------------⓪ * Import eines ID's nach FROM .. IMPORT⓪ * ----------------------------------⓪ *⓪ * (D0-D3)⓪ *⓪ * A0 = ^DefModul⓪ * A2 = ^Id im Programmtext⓪ *⓪ * A2 := ^hinter Id im Text⓪ *)⓪ ⓪ PROCEDURE FromImp;⓪ BEGIN⓪ ASSEMBLER⓪*MOVE #1,explicitImport⓪*MOVE.L A5,-(A7)⓪*MOVE.L A0,-(A7)⓪*JSR GETID ;Id aus Text holen⓪*JSR PULLID⓪*MOVE.L A0,A5 ;^Id⓪*MOVE.L (A7),A0⓪*MOVE.L 8(A0),D0 ;Offset auf PlaTree⓪*BNE OK⓪!!ER86 MOVE #rNoExp,D5 ;keiner da -> ID nicht im DefMod⓪*JMP SyntaxErr⓪!!OK MOVE.L OPTIONS,D2⓪*ADDA.L D0,A0⓪ !FromImp1 MOVE.W (A0)+,D5 ;ItemNr⓪*BEQ ER86 ;Ende des PlaTree -> ID nicht im DefMod⓪*BPL FromImp2 ;dieses Item ist nicht exportiert⓪*CLR.W D0⓪ !FromImp3 MOVE.B 0(A5,D0.W),D1 ;Namen vergleichen:⓪*BEQ FromImp4 ;Ende des Id im Text⓪*MOVE.B 2(A0,D0.W),D3⓪*EOR.B D3,D1⓪*BEQ FromImp5⓪*BTST #3,D2 ;Case Sensitive ?⓪*BNE FromImp2 ; ja⓪*AND.B #$DF,D1⓪*BNE FromImp2⓪ !FromImp5 ADDQ.W #1,D0⓪*BRA FromImp3⓪ !FromImp2 ADDA.W (A0),A0 ;Item ueberspringen⓪*BRA FromImp1⓪ !FromImp4 CMPI.B #$FE,2(A0,D0.W) ;Ende auch im PlaTree?⓪*BCS FromImp2 ; nein, passt nicht⓪*MOVE.W #7,anonFlag⓪*JSR ImpItm20 ; ja, importieren⓪*MOVE.L (A7)+,A0⓪*MOVE.L (A7)+,A5⓪ END⓪ END FromImp;⓪ ⓪ (*⓪ * ----------------------------------⓪ * Importiere komplettes Modul qualifiziert⓪ * ----------------------------------⓪ *⓪ * (A0,D0-D7)⓪ *⓪ * A0 = ^geladenes DefModul⓪ * TOI = DefModulname⓪ *)⓪ PROCEDURE ImpQual;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.L A0,-(A7)⓪)JSR PULLID ;Mod.Name⓪)JSR SETID⓪)MOVE.W #$A010,-2(A1,D6.L) ;als Qualifier eintragen (importiert!!)⓪)SUBQ.L #6,D6⓪)MOVE.L D6,TRESPC⓪)MOVE.L (A7)+,A0⓪)MOVE.L D6,-(A7) ;hier ^lokalen Baum nachtragen⓪)CLR.L -(A6) ;neues Scope⓪)CLR.W PERVIMP ;nicht pervasive⓪)JSR ImpAll ;ganzes Modul importieren⓪)MOVE.L (A7)+,D6⓪)MOVE.L (A6)+,0(A1,D6.L) ;^lok.Baum nachtragen⓪ END⓪ END ImpQual;⓪ ⓪ (*⓪ * ----------------------------------⓪ * Importiere komplettes Modul, nicht qualifiziert⓪ * ----------------------------------⓪ *⓪ * (A0,D0-D7)⓪ *⓪ * A0 = ^DefModul⓪ * TOI = DefModulname⓪ *)⓪ PROCEDURE ImpGlob;⓪ BEGIN⓪ ASSEMBLER⓪)CLR.W PERVIMP ;nicht pervasive⓪)JSR MyPullId ;Modulname nicht benoetigt⓪)JSR ImpAll ;alles importieren⓪ END⓪ END ImpGlob;⓪)⓪ (*⓪ * ----------------------------------⓪ * Importiere komplettes Modul, pervasive⓪ * ----------------------------------⓪ *⓪ * (A0,D0-D7)⓪ *⓪ * A0 = ^DefModul⓪ * TOI = DefModulname⓪ *)⓪ PROCEDURE ImpPer;⓪ BEGIN⓪ ASSEMBLER⓪)CMPI.W #3,IPFLAG ;Import in DefMod?⓪)BNE OK⓪)MOVE #rPerva,D5 ; nicht erlaubt⓪)JMP SyntaxErr⓪ !OK MOVE.W #$FFFF,PERVIMP⓪)JSR MyPullId ;Name nicht benoetigt⓪)JSR ImpAll ;alles importieren⓪ END⓪ END ImpPer;⓪ ⓪ (*⓪ * ----------------------------------⓪ * Kompletten PlaTree importieren⓪ * in ID-Baum kopieren und Importliste anlegen⓪ * ----------------------------------⓪ *⓪ * (D0-D7,A0)⓪ *⓪ * A0 = ^DefMod⓪ * pervimp = Flag "im pervasive Level eintragen"⓪ *)⓪ ⓪ PROCEDURE ImpAll;⓪ BEGIN⓪ ASSEMBLER⓪)CLR explicitImport⓪)MOVE.L A0,-(A7)⓪)MOVE.L 8(A0),D0 ;Offset bis PlaTree⓪)BEQ ImpAll1 ;gar keiner da⓪)ADDA.L D0,A0⓪)MOVE.L A0,-(A7)⓪ ImpAll2 MOVE.W #2,anonFlag⓪)JSR ImpItm ;A0=^ItemNr⓪)TST.W (A0)⓪)BNE ImpAll2 ;PlaTree geht weiter⓪)MOVE.L (A7)+,A0⓪)JSR ImpRest ;VorwaertsRefs nachtragen⓪ ImpAll1 JSR CloseImp ;falls ImpListe leer, loeschen; sonst Endmarke⓪)MOVE.L (A7)+,A0⓪)JSR ImpXRef⓪ END⓪ END ImpAll;⓪ ⓪ (*⓪ * ----------------------------------⓪ * Anonym benutzte Items in ID-Baum uebernehmen;⓪ * Vorwaerts-Referenzen darauf nachtragen⓪ * ----------------------------------⓪ *⓪ * (D0-D7,A0)⓪ *⓪ * A0 = ^PlaTree⓪ *)⓪ PROCEDURE ImpRest;⓪ BEGIN⓪ ASSEMBLER⓪)CLR explicitImport⓪ IMPLOOP MOVEM.L A0/A2,-(A7)⓪)CLR.W D7⓪ ImpRest5 MOVE.W (A0)+,D5 ;ItemNr aus PlaTree⓪)BEQ.W ImpRest2 ; Ende⓪)BCLR #15,D5 ;Export-Flag uninteressant⓪)MOVE.W D5,D0⓪)MULU #6,D0⓪)LEA 0(A3,D0.W),A2 ;Adr in NeubildListe⓪ ImpRest0 CMPI.W #4,(A2) ;CrossRef?⓪)BNE ImpRest7⓪)MOVE.L 2(A2),A2 ; ja, im UrsprungsMod nachsehen⓪)BRA ImpRest0⓪ ImpRest7 CMPI.W #2,(A2) ;VorwaertsRef drauf?⓪)BEQ ImpRest1⓪)CMPI.W #3,(A2) ;nicht anon. Vorwaertsref (Enum-Element) ?⓪)BEQ ImpRest6⓪)CMPI.W #5,(A2) ;Eintrag fertig, aber Name nachzuholen?⓪)BEQ ImpRest6 ; Namen setzen, fertiger Eintrag wird bemerkt⓪)TST.W (A2)⓪)BEQ ImpRest8⓪)ADDA.W (A0),A0 ;nichts zu tun⓪)BRA ImpRest5⓪)⓪ ImpRest8 LEA 0(A3,D0.W),A2 ;Adr in NeubildListe⓪)ADDA.W (A0),A0 ;nichts zu tun⓪)BRA ImpRest5⓪)⓪); Items mit anonymer Vorw.Ref nachbehandeln⓪)⓪ ImpRest1 BSR.L ImpRest3 ;VorwRef: Referenzen nachtragen⓪)MOVEQ #1,D7⓪)BRA ImpRest5⓪)⓪); Items nachbehandeln, die mit Namen bekannt werden dürfen⓪); (anonyme Typbeschreibung KANN vorliegen)⓪)⓪ ImpRest6 MOVE.W #7,anonFlag⓪)JSR ImpItm20 ;nicht-anon. VorwRef: in ID-Baum; Refs nachtr.⓪)MOVEQ #1,D7 ; markiere erfolgten Eintrag⓪)BRA ImpRest5⓪ ⓪ ImpRest2 MOVEM.L (A7)+,A0/A2 ;PlaTree durch⓪)TST.W D7 ;evtl. weitere VorwRefs entstanden?⓪)BNE IMPLOOP ; ja, nochmal durch⓪)RTS⓪)⓪); anonymen Eintrag nachholen (bei anon. VorwaertsRefs)⓪)⓪ ImpRest3 MOVE.W (A0)+,D0 ;^next weg⓪ ImpRest4 MOVE.W (A0)+,D0 ;Namen weg⓪)CMP.B #$FE,D0⓪)BCS ImpRest4⓪)MOVE.W #2,anonFlag ;auch verwiesene Eintraege bleiben anonym⓪)MOVE.L TRESPC,D6⓪)MOVEQ #1,D1 ;anonymer Eintrag geplant⓪)JSR ListImp ;schon da?⓪)JMP ImpItm30⓪ END⓪ END ImpRest;⓪ ⓪ (*⓪ * ----------------------------------⓪ * Importliste abschliessen;⓪ * Gepard-CodeGen: loeschen falls leer⓪ * ----------------------------------⓪ *⓪ * A4 = ^Ende der fertigen Importliste⓪ *)⓪ PROCEDURE CloseImp;⓪ BEGIN⓪ ASSEMBLER⓪)CMPA.L ILEND,A4 ;ILEnd zeigt hinter Kopf der ImpList⓪)BHI CLIMP1⓪ (*$ ? Atari:⓪)MOVE.L A0,-(A7)⓪)MOVE.L ILSTART,A0⓪)CMPI.L #PseudoKey,(A0) ;war Pseudomodul importiert ?⓪)BEQ CLIMP2⓪)CMPI.L #SystemKey,(A0) ;war Systemmodul importiert ?⓪ CLIMP2 MOVE.L (A7)+,A0⓪)BNE CLIMP1 ;wenn nicht, dann Importliste immer stehenl.⓪ *)⓪)MOVE.L ILSTART,A4 ;keine Eintraege; Liste weg⓪)RTS⓪ CLIMP1 CLR.W (A4)+ ;Endmarke⓪ END⓪ END CloseImp;⓪ ⓪ (*⓪ * ----------------------------------⓪ * Implizite Importe bei IMP-Modulen nachholen.⓪ * ----------------------------------⓪ *⓪ * Die Module der impliziten Importliste werden in die Importliste⓪ * übernommen und dann ihre Neubildlisten geprüft und die dort noch⓪ * undefinierten Items in die Importliste nachgetragen.⓪ *⓪ * (D0-D7,A0)⓪ *⓪ * A0 = ^DefMod⓪ * A3 = ^Neubildliste des bearbeiteten Defmods⓪ * A5 = ^Block der Neubildlisten⓪ *)⓪ PROCEDURE ImpXref;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.L A3,-(A7)⓪)CMPI.B #6,(A0) ;Dlayout⓪)BCS.W noimports ; altes Layout⓪)MOVE.L 30(A0),D0⓪)BEQ.W noimports ; keine abhängigen Module⓪)ADDA.L D0,A0⓪ ⓪ IMPLOOP MOVE.L (A0)+,D3 ;Key⓪)BEQ.W noimports ; keine abhängigen Module⓪)MOVE.L A4,ILSTART⓪)MOVE.L D3,(A4)+ ;Key in Importliste eintragen⓪); Modulnamen in Importliste kopieren⓪ SETILST1 MOVE.W (A0)+,D0 ;Modulname aus impliziter Importliste kopieren⓪)MOVE.W D0,(A4)+⓪)CMP.B #$FE,D0⓪)BCS SETILST1⓪)MOVE.L A4,ILEND⓪)⓪); Neubildliste zum Modul suchen⓪)CLR.L D0⓪ Neubild1 MOVE.L 0(A5,D0.L),D1 ;bestehende Liste durchsuchen: Key⓪)BEQ Neubild2 ;kein Modul mehr da⓪)CMP.L D3,D1 ; = Key des geladenen Moduls?⓪)BEQ Neubild3⓪)ADD.L 4(A5,D0.L),D0 ;^naechstes Modul⓪)BRA Neubild1⓪ Neubild2 ;dürfte nicht vorkommen⓪)TRAP #6⓪)DC.W -111 ;um internen Fehler zu melden⓪)BRA Neubild2⓪)⓪ Neubild3 LEA 08(A5,D0.L),A3 ;^bestehende Liste -> A3⓪ ⓪); Schleife: in Neubild nach undefinierten Items suchen⓪)MOVE.L 4(A5,D0.L),D5⓪)SUBI.L #14,D5⓪)DIVU #6,D5 ;Anzahl Items⓪)BRA next⓪ itemloop MOVE D5,D0 ;Itemnr.⓪)MULU #6,D0⓪)TST.W 0(A3,D0.W) ;nachzutragen?⓪)BPL next⓪)⓪)ANDI.W #$FF,0(A3,D0.W) ;->ist nachgetragen⓪)MOVE D5,(A4)+⓪)MOVE.L A0,-(A7)⓪)MOVE.L Header,A0⓪)MOVE.L A4,D1⓪)SUB.L A0,D1⓪)SUB.L 14(A0),D1 ;rel. ^Importlisten-Eintrag⓪)MOVE.L 2(A3,D0.W),D0 ;^Item in Tree⓪)MOVE.L D1,-6(A1,D0.L); im Baum ueber Adr-Eintrag mogeln⓪)MOVE.L (A7)+,A0⓪)CLR.L (A4)+ ;hier ^letzte Ref nachtragen (durch FinImp)⓪)⓪ next DBRA D5,itemloop⓪ ⓪)CLR.W (A4)+ ;Endmarke des Moduls⓪)BRA IMPLOOP ;und nächstes Modul...⓪ ⓪ noimports:⓪);prüfen, ob alle impliziten Importe aufgelöst wurden⓪)MOVE.L (A7)+,A3 ;Neubildliste des importierten Moduls⓪)MOVE.L A3,D0⓪)BEQ nobild ;DefMod hat keine exportierten Items⓪)MOVE.L -4(A3),D5⓪)SUBI.L #14,D5⓪)DIVU #6,D5 ;Anzahl Items⓪)BRA st2⓪ lup2 MOVE D5,D0 ;Itemnr.⓪)MULU #6,D0⓪)LEA 0(A3,D0.W),A0⓪ lup3 CMPI #4,(A0) ;Crossref?⓪)BNE st3⓪)MOVE.L 2(A0),A0⓪)BRA lup3⓪ st3 TST (A0)⓪)BPL st2⓪);Fehler: es ist was übriggeblieben⓪)TRAP #6⓪)DC.W -112 ;um internen Fehler zu melden⓪ st2 DBRA D5,lup2⓪ nobild:⓪ END⓪ END ImpXref;⓪ ⓪ ⓪ PROCEDURE ImportedTwice;⓪"BEGIN⓪$ASSEMBLER⓪)JSR GetNameOfId ;^Namen holen⓪)TST.L D4⓪)BEQ error ;wenn EnumTyp benamt, müssen es die Elems auch⓪)ADDQ.L #8,D4⓪)JSR IDFromTree⓪)MOVE #rId2Im,D5 ;Enum-Elem doppelt importiert⓪)JMP SyntaxErr⓪ error MOVE #rEnuIm,D5 ;"Fehler bei Import von Enum-Elem"⓪)JMP SyntaxErr⓪$END;⓪"END ImportedTwice;⓪ ⓪ (*⓪ * ----------------------------------⓪ * Adresse eines neuen Items registrieren;⓪ * kann auch bereits eingetragen sein (erst anonym, spaeter mit Namen).⓪ * Evtl. vorhandene VorwRefs aufloesen⓪ * ----------------------------------⓪ *⓪ * (D0-D2)⓪ *⓪ * D5 = ItemNr⓪ * D6 = Adresse im ID-Baum⓪ * A0 = ^Item-Beschreibung⓪ * A3 = zustaendige NeubildListe⓪ * D1 = einzutragende Kennung (1 oder 6)⓪ * (wenn 1 übergeben und bisher 3 eingetragen, entsteht 5)⓪ * (wenn 1 übergeben und bisher 6 eingetragen, bleibt 6)⓪ * (wenn 1 übergeben und bisher 5 eingetragen, bleibt 5)⓪ * (wenn 6 übergeben und bisher 3,5,6 eingetr., kommt Fehler)⓪ *⓪ * ZeroFlag := "Item ist noch nicht im Baum"⓪ * D1 := Adresse, falls schon im Baum⓪ *⓪ * Kennung: 0=keine Referenz⓪ * 1=definiert, anonym, Adr enthaelt TreePtr⓪ * 2=VorwaertsRef anonym, Adr enthaelt ^letzte Ref⓪ * 3=VorwaertsRef w/Name, - " -⓪ * 4=importiert, Adr enthaelt abs. ^Ursprungs-Neubild⓪ * 5=definiert, Adr enth. TreePtr, Name ist aber noch nachzu-⓪ * tragen (Enum-Element, wenn Enumtyp nachtr. bekannt wird)⓪ * 6=definiert, Name bekannt, Adr enthaelt TreePtr⓪ *)⓪ ⓪ PROCEDURE ListImp;⓪ BEGIN⓪ ASSEMBLER⓪*MOVE.W D5,D0⓪*BCLR #15,D0⓪*MULU #6,D0⓪*MOVE.L A3,-(A7)⓪*LEA 0(A3,D0.W),A3⓪ !ListImp6 CMPI.W #4,(A3) ;CrossRef (importiert)?⓪*BNE ListImp4⓪*MOVE.L 2(A3),A3 ;im UrsprungsModul bearbeiten⓪*BRA ListImp6⓪ !ListImp4 TST.W (A3)⓪*BEQ.W ListImp1 ;noch unbekannt⓪*CMPI.W #2,(A3)⓪*BEQ ListImp8⓪*CMPI.W #3,(A3)⓪*BEQ ListImp5⓪*⓪*; D1=1: 1 > 1, 5 > 5, 6 > 6⓪*; D1=6: 1 > 6, 5 > 6, 6 > 6⓪*CMP #1,D1 ;*** Item schon bekannt⓪*BEQ ListImp7⓪*TST.W explicitImport ;wird das Elem mit FROM importiert?⓪*BEQ noFrom2⓪*CMPI #5,(A3) ;und wird Name import., obwohl schon gefordert?⓪*BEQ ListImp2 ;dann Fehler: doppelter Import⓪ noFrom2 MOVE.W #6,(A3) ;neue Kennung ('aus 1 mach 6')⓪ !ListImp7 MOVE.L 2(A3),D1 ;Adr⓪*MOVEA.L (A7)+,A3⓪*RTS⓪ ⓪ ListImp2 MOVE.L 2(A3),D6⓪ ListImp0 MOVE.L D6,D2⓪*JMP ImportedTwice⓪ ⓪@;*** VorwaertsRefs!⓪ !ListImp5 ; es gibt bereits eine Vorw-ref auf ein Enum-Elem (wg. Import⓪*; des Enum-Typs). Wird es nun nochmals explizit importiert,⓪*; ist das ein Fehler.⓪*CMP.B #6,D1 ;neuer Eintrag benamt?⓪*BEQ ListImpB⓪*MOVEQ #5,D1 ;nein: aus 1 mach 5 (Namen nachfordern)⓪*BRA ListImp8⓪ !ListImpB TST.W explicitImport ;wird das Elem mit FROM importiert?⓪*BNE ListImp0 ;dann Fehler⓪ !ListImp8 MOVE.W D1,(A3) ;neue Kennung ist 1, 5, oder 6⓪*MOVE.L 2(A3),D2⓪ !ListImp3 MOVE.L 0(A1,D2.L),D1 ;*** VorwRefs: Ptr-Kette abarbeiten⓪*MOVE.L D6,0(A1,D2.L)⓪*MOVE.L D1,D2⓪*BNE ListImp3⓪*BRA ListImp9⓪ ⓪ !ListImp1 ;*** unbenutztes Item⓪*(*⓪*; erstmal prüfen, ob es eine Crossref darauf war⓪*MOVE.L A0,-(A7)⓪*MOVEA.L 4(A7),A0 ;Orig-Neubildliste⓪*LEA 0(A0,D0.W),A0⓪*CMPI.W #4,(A0) ;CrossRef (importiert)?⓪*BNE ListImpA⓪*ST UnknownCrossRef⓪ ListImpA MOVEA.L (A7)+,A0⓪**)⓪*MOVE.W D1,(A3) ;zu benutztem Item machen⓪ ⓪ !ListImp9 MOVE.L D6,2(A3) ;^Tree setzen⓪*CLR.L D1⓪*MOVEA.L (A7)+,A3⓪ END⓪ END ListImp;⓪ ⓪ (*⓪ * ----------------------------------⓪ * Neue Adr eines Items bzw. Pointerketten-Link liefern⓪ * ----------------------------------⓪ *⓪ * D1 = ItemNr aus PlaTree⓪ * A3 = ^Neubildliste⓪ * D3 = Kennung, die bei Entstehen einer VorwRef einzutragen ist.⓪ * 2 = anonym, 3 = mit Namen,⓪ * 7 = Name, auch wenn schon bekannt (wird zu 3 oder 5)⓪ * D0 := rel ^Item im IdBaum⓪ *)⓪ PROCEDURE ItemAdr;⓪ BEGIN⓪ ASSEMBLER⓪)MULU #6,D1⓪)BEQ.W ItemAdr6 ;nil-Ptr: Sonderfall⓪)MOVE.L A3,-(A7)⓪)LEA 0(A3,D1.W),A3⓪ ItemAdr5 MOVE.W (A3),D0⓪)BEQ.W ItemAdr1 ;unbekannt⓪)CMPI.W #4,D0 ;Import⓪)BNE ItemAdr4⓪)MOVE.L 2(A3),A3 ;^Original-Neubildliste⓪)BRA ItemAdr5⓪ ItemAdr4 CMPI.W #2,D0 ;VorwRef anonym ?⓪)BEQ.W ItemAdr2⓪)CMPI.W #3,D0 ;VorwRef mit Namen ?⓪)BEQ.W ItemAdr2⓪)⓪); Adresse des Items ist bekannt⓪)⓪)CMP.W #2,D3 ;anonymer Antrag?⓪)BEQ known ;dann reichts schon⓪)(*⓪)CMP.W #7,D3 ;Namenseintrag unbed. gewuenscht? -> nachfordern⓪)BEQ getName⓪)CMP.W #1,D0 ;Name noch unbekannt?⓪)BNE chkName ; nein -> ist OK⓪)*)⓪ getName MOVE.W #5,(A3) ;nachfordern!⓪ chkName SUBQ.W #5,D0 ;wird Name bereits gesucht?⓪)BEQ impTwice ;ja: dann Fehler melden⓪ known MOVE.L 2(A3),D0 ;Adresse bekannt⓪)MOVE.L (A7)+,A3⓪)RTS⓪ impTwice MOVE.L 2(A3),D2⓪)JMP ImportedTwice⓪ ⓪); VorwaertsRefs⓪)⓪ ItemAdr1 CMP.W #7,D3 ;hier müssen wir aus der 7 eine 3 machen⓪)BNE cont⓪)MOVEQ #3,D3⓪ cont MOVE.W D3,(A3) ;jetzt erstmals VorwaertsRefs entstanden⓪)CLR.L 2(A3)⓪ ⓪ ItemAdr2 MOVE.L 2(A3),D0 ;bestehende VorwRef-Kette verlaengern⓪ ItemAdr3 TST.L D6⓪)BEQ nolink ;Call aus ScanItm, um Kng 3 anzumelden⓪)MOVE.L D6,2(A3)⓪ nolink MOVE.L (A7)+,A3⓪)RTS⓪ ItemAdr6 CLR.L D0⓪ END⓪ END ItemAdr;⓪ ⓪ (*⓪ * ----------------------------------⓪ * Item in ImportListe fuer I/P-Modul eintragen;⓪ * nur Proc/Var/neue Konst. werden eingetragen.⓪ * Import-Flag in D0 setzen⓪ * ----------------------------------⓪ *⓪ * (D1)⓪ *⓪ * D0 = Kennung des Items⓪ * D5 = ItemNr⓪ * D6 = neue IdBaum-Adr⓪ * A0 = ^PlaTree (hinter Kennung)⓪ * A3 = ^Neubildliste⓪ * A4 = ^wachsende Importliste⓪ *)⓪ PROCEDURE IPIMP;⓪ BEGIN⓪ ASSEMBLER⓪)CMPI.B #6,D0 ;Proc?⓪)BEQ IPIMP1⓪)CMPI.B #50,D0 ;neue Const?⓪)BEQ IPIMP1⓪)CMPI.B #17,D0 ;Var?⓪)BNE IPIMP2⓪)BTST #8+4,D0 ;externe Var?⓪)BNE IPIMP2 ;dann nicht in Importliste eintragen⓪ IPIMP1 ; Relozierbare Items dürfen nur aus dem Originalmodul importiert wer-⓪); den. Daher wird hier geprüft, ob das Item nicht eine Crossref ist.⓪)BCLR #15,D5⓪)MOVE D5,D1⓪)MULU #6,D1⓪)CMPI.W #4,0(A3,D1.W) ;CrossRef (importiert)?⓪)BNE ok⓪)MOVE.L A0,-(A7)⓪)LEA 0(A3,D1.W),A0⓪ lup MOVE.L 2(A0),A0⓪)CMPI.W #4,(A0)⓪)BEQ lup⓪)ORI.W #$8000,(A0) ;(s. ImpXRef)⓪)MOVE.L (A7)+,A0⓪)BRA IPIMP3⓪ ok: MOVE.W D5,(A4)+ ;ItemNr in Importliste schreiben⓪)MOVE.L A0,-(A7)⓪)MOVE.L Header,A0⓪)MOVE.L A4,D1⓪)SUB.L A0,D1⓪)SUB.L 14(A0),D1 ;rel. ^Importlisten-Eintrag⓪)MOVE.L (A7)+,A0⓪)MOVE.L D1,(A0) ; im Baum ueber Adr-Eintrag mogeln⓪)CLR.L (A4)+ ;hier ^letzte Ref nachtragen (durch FinImp)⓪ IPIMP3: BSET #13,D0 ;Import-Flag setzen⓪ IPIMP2:⓪ END⓪ END IPIMP;⓪ ⓪ (* §§§⓪ * ----------------------------------⓪ * Item in Importliste fuer Def.Modul eintragen⓪ * Import-Flag in Kennung (D0) setzen⓪ * ----------------------------------⓪ *⓪ * D0 = Kennung⓪ * D5 = ItemNr⓪ * D6 = neue IdBaum-Adr⓪ * A4 = ^wachsende ImportListe⓪ * CurrentDef = Anfangsadresse des bearbeiteten DefMod⓪ *)⓪ PROCEDURE DefImp;⓪ BEGIN⓪ ASSEMBLER⓪)BSET #13,D0 ;als Import kennzeichnen⓪)BCLR #15,D5⓪)⓪ (*$ ? Gepard:⓪(MOVE.W D5,(A4)+ ;bearbeitete ItemNr⓪(MOVE.L D6,(A4)+ ;Neubild (später eigene ItemNr)⓪ *)⓪ ⓪ (*$ ? Atari:⓪)⓪); suche, ob Item schon im Ursprungsmodul importiert war⓪)⓪)MOVEM.L D0/D1/A0,-(A7)⓪)MOVE.L CurrentDef,A0⓪)TST.L 14(A0) ;Offset zur Importliste im geladenen DefMod⓪)BEQ.W notfnd ; keine Importe⓪)ADDA.L 14(A0),A0⓪)BRA look⓪ look2 LEA 2(A0,D1.W),A0 ;A0 hinter Endmarke der vorigen Importliste⓪ look TST.L (A0) ;noch ein Import?⓪)BEQ.W notfnd ; noe⓪)CLR.W D1⓪)ADDQ #2,D1 ;Key, Anzahl Items weg⓪ look1 ADDQ #4,D1 ;beide ItemNr weg⓪)TST.W 0(A0,D1.W)⓪)BEQ look2 ;Endmarke⓪)CMP.W 2(A0,D1.W),D5 ;dessen eigene Nummer = bearbeitete?⓪)BNE look1 ; ja⓪)⓪); ja, Originalursprung eintragen⓪)⓪ found MOVE.L (A0),D0⓪)CMP.L CurrentKey,D0 ;gleiches Modul wie zuvor?⓪)BEQ same⓪)MOVE.L D0,CurrentKey⓪)CLR.W (A4)+ ; nein, Endmarke⓪)MOVE.L D0,(A4)+ ;neuen Key kopieren⓪)MOVE.W 4(A0),(A4)+ ;Anzahl Items kopieren⓪)BSR copymodname⓪ same MOVE.W 0(A0,D1.W),(A4)+ ;fremde Nummer kopieren⓪)BRA ok⓪ ⓪ copymodname: ;Modulname ggf. aus impliziter Importliste holen⓪)MOVE.L A0,-(A7)⓪)MOVE.L CurrentDef,A0⓪)CMPI.B #6,(A0) ;Dlayout⓪)BCS endloop⓪)ADDA.L 30(A0),A0⓪ loopimp TST.L (A0)⓪)BEQ endloop⓪)CMP.L (A0)+,D0 ;Key: gesuchtes Modul?⓪)BEQ foundimp⓪ nextimp MOVE (A0)+,D0 ;weiter zum nächsten Key⓪)CMPI.B #$FE,D0⓪)BCS nextimp⓪)BRA loopimp⓪ endloop CLR.W (A4)+ ;Flag: kein Modulname bekannt⓪)MOVE.L (A7)+,A0⓪)RTS⓪ ⓪ foundimp MOVE.W #1,(A4)+ ;Flag: Modulname ist bekannt⓪ nextcop MOVE (A0)+,D0⓪)MOVE D0,(A4)+⓪)CMPI.B #$FE,D0⓪)BCS nextcop⓪)MOVE.L (A7)+,A0⓪)RTS⓪ ⓪); nein, geladenes DefMod ist Ursprung⓪)⓪ notfnd MOVE.L CurrentDef,A0⓪)MOVE.L 4(A0),D0 ;Key⓪)CMP.L CurrentKey,D0 ;gleiches Modul wie zuvor?⓪)BEQ same1⓪)MOVE.L D0,CurrentKey⓪)CLR.W (A4)+ ; nein, Endmarke⓪)MOVE.L D0,(A4)+ ;neuen Key kopieren⓪)MOVE.W 12(A0),(A4)+ ;Anzahl Items⓪)BSR copymodname⓪ same1 MOVE.W D5,(A4)+ ;bearbeitete ItemNr⓪ ⓪ ok MOVEM.L (A7)+,D0/D1/A0⓪)MOVE.L D6,(A4)+ ;Neubild: erlaubt spaeter Feststellung⓪?; der eigenen ItemNr⓪ *)⓪ END⓪ END DefImp;⓪ ⓪ (*⓪ * ----------------------------------⓪ * Itemeintrag im PlaTree scannen;⓪ * wenn ^named ID (Enum-Element) vorhanden,⓪ * Nachtrag des Namens ueber ItemAdr anmelden.⓪ *⓪ * Sollte nur fuer EnumType/EnumElement aufgerufen werden,⓪ * wenn nachtraeglich ein Import mit Namen gefordert wird.⓪ * (Kann nicht mit lok. Baeumen und Const-Eintragungen umgehen!)⓪ * ----------------------------------⓪ *⓪ * TT 01.10.90: Ging schief, wenn zuerst ein Modul mit Enums qual. importiert,⓪ * dann nochmal der EnumTyp unqual. importiert wird: Adr. und Name der⓪ * Enum-Elems sind im Neubild schon als bekannt gekennzeichnet, obwohl ihr⓪ * Name, wie der vom EnumTyp, nochmal im globalen Tree m. Relay angelegt⓪ * werden müßte. Deshalb wird hier nun, wenn der Name schon bei ItemAdr⓪ * bekannt, trotzdem der Name nochmal angefordert - ggf. tritt dann eine⓪ * Namenskollision auf, die aber auch immer ein echter Fehler sein dürfte.⓪ * Bei kompletten Modulimporten dürfen die IDs natürlich nicht unbedingt⓪ * angelegt werden, weil die Items sowieso alle drankommen. Die Steuerung⓪ * dafür übernimmt "anonFlag".⓪ *⓪ * (D0-D7,A0)⓪ *⓪ * A0 = ^PlaTree, auf ItemNr⓪ * A3 = ^Neubildliste⓪ *⓪ * A0 := ^PlaTree, hinter kopiertes Item⓪ *)⓪ ⓪ PROCEDURE ScanItm;⓪ BEGIN ASSEMBLER⓪*MOVE.W (A0)+,D0 ;Kennung⓪*MOVE.L A2,-(A7)⓪*⓪*; passende Eintrags-Beschreibung suchen⓪*⓪*LEA ITEMS,A2 ;Liste der Item-Beschreibungen⓪ ScanItm8 CMP.B (A2)+,D0⓪*BEQ ScanItm6 ;-> Item gefunden⓪ ScanItm7 TST.B (A2)+ ;falsch, Beschreibung ueberspringen⓪*BNE ScanItm7⓪*TST.B (A2) ;Liste zuende?⓪*BNE ScanItm8 ; nein, weiter⓪ ScanErr MOVE.L (A7)+,A2⓪*MOVE #rImpor,D5 ; ja, merkwuerdig (kann nicht vorkommen!)⓪*JMP SyntaxErr⓪*⓪*; Eintrag durchsehen⓪*⓪ skipL ADDQ.L #2,A0⓪ skipW ADDQ.L #2,A0⓪ ScanItm6 MOVE.B (A2)+,D1 ;* Beschreibung kopieren *⓪*BEQ ScanItm12 ;Ende dieses Eintrags⓪*CMPI.B #1,D1⓪*BEQ SkipW ;Const.W⓪*CMPI.B #2,D1⓪*BEQ SkipL ;Const.L⓪*CMPI.B #3,D1⓪*BEQ SkipW ;Pointer⓪*⓪*CMPI.B #5,D1 ;^Identifier (ID muss mit imp. werden)⓪*BEQ enumTyp⓪*⓪*CMPI.B #8,D1 ;^Identifier (ID muss mit imp. werden)⓪*BNE ScanErr ;falsche Komponente im Eintrag⓪*MOVE.W (A0)+,D1⓪*MOVE.W anonFlag,D3 ;Flag, ob der Name unbedingt zu holen ist⓪*TST.W explicitImport ;wird das Elem mit FROM importiert?⓪*BEQ ImpItm223⓪*MOVEQ #2,D3 ;dann Rest anonym nachfordern⓪ ImpItm223 CLR.L D6 ;keine Linked List bei Vorw.eintraegen⓪*JSR ItemAdr⓪*BRA ScanItm6⓪ ⓪ enumTyp MOVE.W (A0)+,D1⓪*MOVE.W anonFlag,D3 ;Flag, ob der Name unbedingt zu holen ist⓪*CLR.L D6 ;keine Linked List bei Vorw.eintraegen⓪*JSR ItemAdr⓪*BRA ScanItm6⓪ ScanItm12 MOVE.L (A7)+,A2⓪ END⓪ END ScanItm;⓪ ⓪ (*⓪ * ----------------------------------⓪ * Ein Item in Baum eintragen;⓪ * prueft, ob Eintrag schon da⓪ * ----------------------------------⓪ *⓪ * (D0-D7,A0)⓪ *⓪ * A0 = ^PlaTree, auf ItemNr⓪ * A3 = ^Neubildliste⓪ *⓪ * A0 := ^PlaTree, hinter kopiertes Item⓪ *)⓪ ⓪ PROCEDURE ImpItm;⓪ BEGIN⓪ ASSEMBLER⓪)BTST #7,(A0) ;exportiert?⓪)BEQ L1⓪)JMP ImpItm1⓪ !L1 ADDQ.L #2,A0⓪)ADDA.W (A0),A0⓪ END⓪ END ImpItm;⓪ ⓪ PROCEDURE ImpItm1;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.W (A0)+,D5 ;ItemNr⓪)BCLR #15,D5 ;Export-Flag weg⓪)JMP ImpItm20⓪ END⓪ END ImpItm1;⓪ ⓪ (*⓪#Item aus Def-Modul importieren - entscheidet, ob nur Relay⓪#angelegt oder es ganz in den Tree kopiert wird.⓪ *)⓪ PROCEDURE ImpItm20;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.L A0,-(A7) ;=== Einsprung von FromImp, ImpRest⓪)ADDQ.L #2,A0⓪)CMPI.B #$FE,(A0)⓪)BCC ImpItm2 ;>= $FE -> kein Id, sondern Endmarke⓪)TST.W PERVIMP ;* ID in Baum eintragen *⓪)BEQ ImpItm17⓪)JSR SETPER ; pervasive⓪)BRA ImpItm3⓪ ImpItm17 JSR SETID ; normal⓪ ImpItm3 MOVE.W A0,D0 ;Sync A0 hinter Namen⓪)BTST #0,D0⓪)BEQ ImpItm18⓪)ADDQ.L #1,A0⓪ ImpItm18 MOVE.L TRESPC,D6⓪)MOVEQ #6,D1 ;wir wollen einen Eintrag mit Namen anlegen⓪)JSR ListImp ;Item bereits eingetragen?⓪)BEQ ImpItm4 ; nein, neu eintragen⓪)CLR.B -1(A1,D6.L) ; ja, Relay anlegen: Kennung ist 0.B,⓪)TST.B -1(A1,D1.L) ;ist Item selbst ein Relay?⓪)BNE noRelay⓪)MOVE.L -6(A1,D1.L),D1 ;dann Verweis verwenden⓪ noRelay MOVE.B -2(A1,D1.L),-2(A1,D6.L) ; Flags kopieren!⓪)MOVE.L D1,-6(A1,D6.L)⓪)SUBQ.L #6,D6⓪)MOVE.L D6,TRESPC⓪)MOVE.B -1(A1,D1.L),D1 ;Kennung des Objekts⓪)CMP.B #09,D1 ;Enumtyp ?⓪)BEQ Scan⓪)CMP.B #10,D1 ;Enum-Element ?⓪)BNE ImpItm5⓪ Scan ADDQ.L #4,A7⓪)JMP ScanItm ;Namenseintrag fuer EnumElement nachfordern⓪ ImpItm2 MOVE.W #2,anonFlag⓪)ADDQ.L #2,A0 ;Dummy-Name weg⓪)MOVE.L TRESPC,D6 ;* Item anonym eintragen *⓪)MOVEQ #1,D1 ;geplant ist anonymer Eintrag⓪)JSR ListImp ;schon eingetragen?⓪)BEQ ImpItm4 ; nein, eintragen⓪ ImpItm5 MOVE.L (A7)+,A0 ; ja, Rest des Eintrags im PlaTree ueberspringen⓪)ADDA.W (A0),A0⓪)RTS⓪ ImpItm4 ADDQ.L #4,A7 ;* Item muss wirklich kopiert werden *⓪)JMP ImpItm30⓪ END⓪ END ImpItm20;⓪ ⓪ (*⓪#Importiertes Item in Importliste eintragen⓪ *)⓪ PROCEDURE ImpItm30;⓪ BEGIN⓪ ASSEMBLER⓪); === Einsprung von ImpRest⓪)MOVE.W (A0)+,D0 ;Kennung⓪)CMPI.W #3,IPFLAG ;DefMod?⓪)BEQ ImpItm15⓪)JSR IPIMP ; nein, ImpListe fuer Imp/PgmMod⓪)JMP ImpItm16⓪ ImpItm15 JSR DefImp ; ja, ImpListe fuer DefMod⓪)JMP ImpItm16⓪ END⓪ END ImpItm30;⓪ ⓪ (*⓪#Item aus Def-Modul in Baum eintragen⓪ *)⓪ PROCEDURE ImpItm16;⓪ BEGIN⓪ ASSEMBLER⓪*JSR SETKNG ;=== Einsprung von OwnDef⓪*MOVE.L D6,-(A7)⓪*SUBQ.L #2,D6⓪*MOVE.L A2,-(A7)⓪*CMPI.B #31,D0 ;StrConst?⓪*BNE ImpItm23⓪ ⓪*; Sonderbehandlung String-Const⓪*MOVE.B (A0),D1 ; ja, Laenge holen⓪*BSET #0,D1 ; auf gerade Byte-Zahl aufrunden⓪ !ImpItm24 SUBQ.L #1,D6 ; und String kopieren⓪*MOVE.B (A0)+,0(A1,D6.L)⓪*DBF D1,ImpItm24⓪*BRA.L ImpItm12⓪ ⓪ !ImpItm23 LEA ITEMS,A2 ;Liste der Item-Beschreibungen⓪ !ImpItm8 CMP.B (A2)+,D0⓪*BEQ ImpItm6 ;-> Item gefunden⓪ !ImpItm7 TST.B (A2)+ ;falsch, Beschreibung ueberspringen⓪*BNE ImpItm7⓪*TST.B (A2) ;Liste zuende?⓪*BNE ImpItm8 ; nein, weiter⓪*MOVE.L (A7)+,A2⓪*MOVE #rImpor,D5 ; ja, merkwuerdiges Item⓪*JMP SyntaxErr⓪ ⓪ !ImpItm6 MOVE.B (A2)+,D1 ;* Beschreibung kopieren *⓪*BEQ.L ImpItm12 ;Ende dieses Eintrags⓪*⓪*CMPI.B #1,D1⓪*BNE ImpItm9⓪*MOVE.W (A0)+,D1 ;^anderes Item, anonym⓪*SUBQ.L #4,D6⓪*MOVEQ #2,D3 ;Flag 'anonym'⓪*JSR ItemAdr ;Adresse bzw. Pointerkette⓪*MOVE.L D0,0(A1,D6.L)⓪*BRA ImpItm6⓪ ⓪ !ImpItm9 CMPI.B #2,D1⓪*BNE ImpItm10⓪*SUBQ.L #4,D6 ;Const.L⓪*MOVE.L (A0)+,0(A1,D6.L)⓪*BRA ImpItm6⓪ ⓪ !ImpItm10 CMPI.B #3,D1⓪*BNE ImpItm11⓪*SUBQ.L #2,D6 ;Const.W⓪*MOVE.W (A0)+,0(A1,D6.L)⓪*BRA ImpItm6⓪ ⓪ !ImpItm11 CMPI.B #4,D1⓪*BNE ImpItm22⓪*SUBQ.L #4,D6 ;Record: lokaler Baum⓪*MOVE.L D6,TRESPC⓪*MOVE.L D6,-(A7) ;hier ^lok.Baum nachtragen⓪*CLR.L -(A6)⓪ !ImpItm14 TST.W (A0) ;Ende des lok. Baums?⓪*BEQ ImpItm25⓪*MOVE.W anonFlag,-(A7)⓪*JSR ImpItm1 ; nein, weiter⓪*MOVE.W (A7)+,anonFlag⓪*BRA ImpItm14⓪ !ImpItm25 ADDQ.L #2,A0 ; ja, Endmarke ueberspringen⓪*MOVE.L (A7)+,D1⓪*MOVE.L (A6)+,0(A1,D1.L) ;^lokalen Baum nachtragen⓪*BRA.W ImpItm13⓪ ⓪ !ImpItm22 CMPI.B #5,D1⓪*BNE ImpItm222⓪*SUBQ.L #4,D6 ;^Enum-Elem von Enum-Typ⓪*MOVE.W (A0)+,D1⓪*MOVE.W anonFlag,D3 ;anonym nur, wenn laufendes Item selbst anon.⓪*JSR ItemAdr⓪*MOVE.L D0,0(A1,D6.L)⓪*BRA ImpItm6⓪*⓪ ImpItm222 CMPI.B #8,D1⓪*BNE ImpItm26⓪*SUBQ.L #4,D6 ;^Enum-Elem von Enum-Elem⓪*MOVE.W (A0)+,D1⓪*MOVE.W anonFlag,D3 ;anonym nur, wenn laufendes Item selbst anon.⓪*TST.W explicitImport ;wird das Elem mit FROM importiert?⓪*BEQ ImpItm223⓪*MOVEQ #2,D3 ;dann Rest anonym nachfordern⓪ ImpItm223 JSR ItemAdr⓪*MOVE.L D0,0(A1,D6.L)⓪*BRA ImpItm6⓪ ⓪ ImpItm26 CMPI.B #7,D1 ;Insert <n> Bytes-Anweisung?⓪*BNE ImpItm28⓪*MOVEQ #0,D1⓪*MOVE.B (A2)+,D1 ;hole Anzahl Bytes⓪*BRA ImpItm26b⓪ ImpItm26a SUBQ.L #1,D6 ;Const.W⓪*CLR.B 0(A1,D6.L)⓪ ImpItm26b DBRA D1,ImpItm26a ;im Baum reservieren & löschen⓪*BRA ImpItm6⓪*⓪ !ImpItm28 SUBQ.L #2,D6 ;Laengenangabe fuer folgende Const⓪*MOVE.W (A0)+,D0⓪*MOVE.W D0,0(A1,D6.L)⓪ !ImpItm27 MOVE.L (A0)+,-4(A1,D6.L) ;Const kopieren⓪*SUBQ.L #4,D6⓪*SUBQ.W #4,D0⓪*BGT ImpItm27⓪*BRA ImpItm6⓪ ⓪ !ImpItm12 MOVE.L D6,TRESPC⓪ !ImpItm13 MOVE.L (A7)+,A2⓪ ⓪*; bei Real-Consts ggf. Format anpassen⓪*MOVE.L (A7)+,D0⓪*TST mustChgFormat ;bleibt Format unverändert?⓪*BEQ ImpItm29⓪*CMPI.B #18,-1(A1,D0.L) ;Const?⓪*BEQ ImpItm31⓪*CMPI.B #50,-1(A1,D0.L) ;Const?⓪*BNE ImpItm29⓪*MOVE.L -10(A1,D0.L),D1 ;Typ^ holen⓪*BRA ImpItm32⓪ ImpItm31: MOVE.L -6(A1,D0.L),D1 ;Typ^ holen⓪ ImpItm32: CMP.L RealPtr,D1⓪*BEQ lReal⓪*CMP.L SRealPtr,D1⓪*BNE ImpItm29⓪*; ShortReal anpassen⓪*MOVEM.L D2/A0-A3,-(A7)⓪*; *** zeitweilige Restriktion: Keine Formatanpassung bei ShortReals!⓪*MOVE #rRealF,D5⓪*JMP SyntaxErr⓪*BRA ImpItm21⓪ lReal ; LongReal anpassen⓪*MOVEM.L D2/A0-A3,-(A7)⓪*MOVE.L EvalStk,A3⓪*LEA -8(A1,D0.L),A0⓪*CMPI.B #50,-1(A1,D0.L) ;Const neu?⓪*BNE ImpItm33⓪*SUBQ.L #8,A0⓪ ImpItm33: MOVE.L -(A0),(A3)+⓪*MOVE.L -(A0),(A3)+⓪*MOVE.L A0,-(A7)⓪*MOVE defFormat,D0⓪*MOVE D0,(A3)+ ;Format im Def-Mod⓪*EORI #1,D0⓪*MOVE D0,(A3)+ ;Zielformat⓪*JSR Conv⓪*MOVE.L (A7)+,A0⓪*MOVE.L -(A3),(A0)+⓪*MOVE.L -(A3),(A0)+⓪ !ImpItm21 MOVEM.L (A7)+,D2/A0-A3⓪*JSR RealConstIsUsed ;Real-Format ist nun festgelegt⓪ !ImpItm29⓪ END⓪ END ImpItm16;⓪ ⓪ (*⓪ PROCEDURE ConvRealToDestFormat;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L A3,-(A7)⓪(MOVE.L EvalStk,A3⓪(MOVE UseFormat,D0⓪(CMPI #3,D0⓪(BEQ noRconv ;hat schon richtiges Format⓪(! wenn Werte = 2, dann 1 daraus machen!⓪(MOVE SysFormat,(A3)+ ;Format der Zahl⓪(MOVE D0,(A3)+ ;gewünschtes Format⓪(JSR Conv⓪&noRconv⓪(MOVE.L -(A3),AccuS14⓪(MOVE.L -(A3),Accu⓪(MOVE.L A3,EvalStk⓪(MOVE.L (A7)+,A3⓪$END⓪"END ConvRealToDestFormat;⓪ ⓪ PROCEDURE ConvRealToSysFormat;⓪"(* A0: Ptr auf Real-Const *)⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L A3,-(A7)⓪(MOVE.L EvalStk,A3⓪(MOVE UseFormat,D0⓪(CMPI #3,D0⓪(BEQ noRconv ;hat schon richtiges Format⓪(! wenn Werte = 2, dann 1 daraus machen!⓪(MOVE SysFormat,(A3)+ ;Format der Zahl⓪(MOVE D0,(A3)+ ;gewünschtes Format⓪(JSR Conv⓪&noRconv⓪(MOVE.L -(A3),AccuS14⓪(MOVE.L -(A3),Accu⓪(MOVE.L A3,EvalStk⓪(MOVE.L (A7)+,A3⓪$END⓪"END ConvRealToSysFormat;⓪ *)⓪ ⓪ (*⓪ * ----------------------------------⓪ * Item aus eigenem DefModul importieren:⓪ * aus PlaTree kopieren,⓪ * exportierte Proc/Var in ExportListe eintragen⓪ * ----------------------------------⓪ *⓪ * (D0,D5,D6,A4)⓪ *⓪ * A0 = ^Item im PlaTree⓪ * A4 = laufender ^ auf entstehende ExportListe⓪ *)⓪ PROCEDURE OwnItm;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.W (A0)+,D5 ;ItemNr⓪)MOVE.L A0,-(A7)⓪)ADDQ.L #2,A0⓪)CMPI.B #$FE,(A0)⓪)BCC OwnItm2 ;>= $FE -> kein Id, sondern Endmarke⓪)⓪)JSR SETID ;ID eintragen⓪)MOVE.W A0,D0⓪)BTST #0,D0 ;Sync A0⓪)BEQ OwnItm3⓪)ADDQ.L #1,A0⓪ !OwnItm3 MOVE.W #2,anonFlag ;2: die IDs kommen ja sowieso irgendwann vor...⓪)MOVE.L TRESPC,D6⓪)MOVEQ #6,D1 ;wir wollen einen Eintrag mit Namen anlegen⓪)JSR ListImp ;Item anonym schon da?⓪)BEQ OwnItm4 ;nein, neu eintragen⓪)CLR.B -1(A1,D6.L) ; ja, Relay anlegen: Kennung und..⓪)TST.B -1(A1,D1.L) ;ist Item selbst ein Relay?⓪)BNE noRelay⓪)MOVE.L -6(A1,D1.L),D1 ;dann Verweis verwenden⓪ noRelay MOVE.B -2(A1,D1.L),-2(A1,D6.L) ; Flags kopieren⓪)MOVE.L D1,-6(A1,D6.L)⓪)SUBQ.L #6,D6⓪)MOVE.L D6,TRESPC⓪)CMPI.B #25,-1(A1,D1.L) ;Opaque?⓪)BNE OwnItm5⓪)MOVE.B #8,-1(A1,D1.L) ;redeclarable machen (jm 1404)⓪ !OwnItm5 MOVE.L (A7)+,A0⓪)ADDA.W (A0),A0⓪)RTS ;PlaTree-Eintrag ueberspringen⓪ ⓪ !OwnItm2 MOVE.L TRESPC,D6 ;*** anonymes Item eintragen:⓪)MOVE.W #2,anonFlag⓪)ADDQ.L #2,A0 ;Blind-ID weg⓪)MOVEQ #1,D1 ;geplant ist anonymer Eintrag⓪)JSR ListImp⓪)BNE OwnItm5 ;gibt's schon: nichts zu tun⓪ !OwnItm4 ADDQ.L #4,A7⓪)MOVE.W (A0)+,D0 ;Kennung⓪)BCLR #15,D5 ;Export?⓪)BEQ OwnItm7 ;nein⓪)CMPI.B #50,D0 ;Const?⓪)BEQ OwnItm8⓪)CMPI.B #17,D0 ;Var?⓪)BEQ OwnItm8⓪)CMPI.B #6,D0 ;Proc?⓪)BNE OwnItm7⓪ OwnItm6 BSET #12,D0 ;Proc zus. markieren (falls Implement. fehlt,⓪?; soll das von FORWARD-Dekl. unterscheidbar sein⓪ OwnItm8 MOVE.W D5,(A4)+ ;ItemNr der Var/Proc in Exp.Liste eintragen⓪)MOVE.L D6,(A4)+ ; hier Adr nachtragen⓪ OwnItm7 CMPI.B #50,D0 ;Const?⓪)BEQ L1⓪)CMPI.B #25,D0 ;Opaque?⓪)BNE L0⓪)MOVE.B #8,D0 ;redeclarable machen⓪)BRA L0⓪ L1: BSET #12,D0 ;Flag setzen, um zu erkennen, daß eigene⓪?; CONST auch außerhalb des Moduls evtl. benutzt⓪?; wird, damit sie dann nicht wegoptimiert wird.⓪ L0: JMP ImpItm16⓪ END⓪ END OwnItm;⓪)⓪ (*⓪ * ----------------------------------⓪ * Eigenes Def.Modul in Impl.Modul laden:⓪ * PlaTree uebernehmen, Exportliste anlegen⓪ * ----------------------------------⓪ *⓪ * (D0,D3,A3,A4)⓪ *⓪ * A4 = Beginn der anzulegenden Exportliste⓪ *⓪ * A0 := ^eigenes DefModul⓪ * VarSpc := Platzbedarf der im DefMod deklarierten Variablen⓪ *)⓪ PROCEDURE OwnDef;⓪ BEGIN⓪ ASSEMBLER⓪)MOVE.W D3,-(A7)⓪)MOVE.W OLDSBL,-(A7)⓪)CLR.W PERVIMP ;wird beim Import von Records abgefragt!⓪)JSR SetDef⓪)BEQ OK⓪)MOVE #rMyDef,D5 ;nicht gefunden⓪)JMP SyntaxErr⓪ !OK MOVE.L A0,-(A7)⓪)MOVE.L A4,D0⓪)MOVE.L Header,A0⓪)SUB.L A0,D0⓪)MOVE.L D0,18(A0) ;^Exp.Liste⓪)MOVE.L (A7),A0 ;wieder ^eigenes DefMod⓪)MOVE.L 8(A0),D0 ;Offset bis PlatTree⓪)BEQ OwnDef1 ;keiner da⓪)ADDA.L D0,A0⓪ !OwnDef2 TST.W (A0) ;Liste zuende?⓪)BEQ OwnDef1⓪)JSR OwnItm ;A0=^ItemNr⓪)BRA OwnDef2⓪ !OwnDef1 CLR.W (A4)+ ;Endmarke Exp.Liste⓪)MOVE.L (A7)+,A0⓪)MOVE.L Header,A3⓪)MOVE.L 4(A0),2(A3) ;Key fuer I.Mod uebernehmen⓪)MOVE.L 18(A0),VARSPC ;Platz der vergebenen Var.⓪)MOVE.W (A7)+,OLDSBL⓪)MOVE.W (A7)+,D3⓪ END⓪ END OwnDef;⓪ ⓪ ⓪ CONST PseudoLen = 78; (* Anzahl def. Items *)⓪)SystemLen = 38; (* Anzahl def. Items *)⓪ ⓪ (*⓪!* ----------------------------------⓪!* Pseudo-Modul mit StandardTypen und -Prozeduren⓪!* ----------------------------------⓪!* Pseudo- und Systemmodul muessen in dieser Reihenfolge hintereinander⓪!* stehen, damit in Neubild die Platzpruefung funktioniert!⓪!*)⓪ ⓪ PROCEDURE Pseudo;⓪ BEGIN⓪ ASSEMBLER⓪ Pseudo0 DC.B 6,3 ;Dlayout⓪)DC.W 2 ;pervasive-Flag⓪)DC.L PseudoKey ;Key⓪(;DC.L Pseudo1-Pseudo0 ;^ExportListe⓪)DC.L 62⓪)DC.W PseudoLen ;Anzahl def. Items⓪(;DC.L PseudoI-Pseudo0 ;^ImportListe⓪)DC.L 34⓪)DC.L 0 ;Platz fuer definierte Var.⓪)DC.L 0 ;^Modulname⓪(;DC.W PseudoI-Pseudo0⓪)DC.W 34 ;Headerlänge⓪)DC.W 0 ;^Sourcename⓪)DC.L 0 ;^Liste d. implizit zu importierenden Module⓪ PseudoI DC.L SystemKey ;Import aus System⓪)DC.W SystemLen ;Anzahl Items in System⓪)DC.W 1 ;WORD importieren⓪)DC.W 27 ;eigene ItemNr⓪)DC.W 2 ;ADDRESS importieren⓪)DC.W 48⓪)DC.W 3 ;LONG importieren⓪)DC.W 28⓪)DC.W 4 ;BYTE importieren⓪)DC.W 29⓪)DC.W 0⓪)DC.L 0 ;Ende der Importliste⓪ Pseudo1 DC.W $8001,16 ;TYPE LongInt⓪)ASC 'LONGINT'⓪)DC.B $FF⓪)DC.W $8501⓪)DC.L 4⓪ Pseudo2 DC.W $8002,18 ;TYPE LongReal⓪)ASC 'LONGREAL'⓪)DC.B $FE,$FF⓪)DC.W $8402⓪)DC.L 8⓪ Pseudo3 DC.W $8003,18 ;TYPE LongCard⓪)ASC 'LONGCARD'⓪)DC.B $FE,$FF⓪)DC.W $8516⓪)DC.L 4⓪ Pseudo4 DC.W $8004,14 ;TYPE Char⓪)ASC 'CHAR'⓪)DC.B $FE,$FF⓪)DC.W $8503⓪)DC.L 1⓪ Pseudo5 DC.W $8005,16 ;TYPE Boolean⓪)ASC 'BOOLEAN'⓪)DC.B $FF⓪)DC.W $8518⓪)DC.L 2⓪ Pseudo6 DC.W $8006,18 ;TYPE SHORTINT⓪)ASC 'SHORTINT'⓪)DC.B $FE,$FF⓪)DC.W $8521⓪)DC.L 2⓪ Pseudo7 DC.W $8007,18 ;TYPE SHORTCARD⓪)ASC 'SHORTCARD'⓪)DC.B $FF⓪)DC.W $8522⓪)DC.L 2⓪ Pseudo8 DC.W $8008,10 ;TYPE ShortBothType⓪)DC.B $FE,$FF⓪)DC.W $8523⓪)DC.L 2⓪ Pseudo9 DC.W $8009,10 ;TYPE LongBothType⓪)DC.B $FE,$FF⓪)DC.W $851E⓪)DC.L 4⓪ (*$? NOT BITSETfromSYSTEM:⓪ Pseudo10 DC.W $800A,18 ;TYPE BitSet⓪)ASC 'BITSET'⓪)DC.B $FE,$FF⓪)DC.W $842D ; nun mit Kennung 45 statt 5! (30.6.90)⓪)DC.L 2⓪)DC.W 72⓪ *)⓪ (*$? BITSETfromSYSTEM:⓪ Pseudo10 DC.W $000A,6 ;nur dummy⓪)DC.B $FE,$FF⓪)DC.W $803F⓪ *)⓪ Pseudo11 DC.W $800B,18 ;TYPE Proc⓪)ASC 'PROC'⓪)DC.B $FE,$FF⓪)DC.W $8413⓪)DC.L 4⓪)DC.W 0,0⓪ Pseudo12 DC.W $800C,10 ;TYPE ZZ⓪)DC.B $FE,$FF⓪)DC.W $8504⓪)DC.L 6⓪ Pseudo13 DC.W $800D,14 ;TYPE ShortReal⓪)ASC 'REAL'⓪)DC.B $FE,$FF⓪)DC.W $8428⓪)DC.L 4⓪ Pseudo14 DC.W $800E,14 ;TYPE Integer⓪)ASC 'INTEGER'⓪)DC.B $FF⓪)DC.W $0000 ; Relay auf SHORTINT⓪)DC.W 6⓪ Pseudo15 DC.W $800F,16 ;TYPE Cardinal⓪)ASC 'CARDINAL'⓪)DC.B $FE,$FF⓪)DC.W $0000 ; Relay auf SHORTCARD⓪)DC.W 7⓪ Pseudo16 DC.W $8010,6 ;Hilfseintrag f. noch ungelöste Ptr/Proc-Refs⓪)DC.B $FE,$FF⓪)DC.W $8000+48⓪ Pseudo17 DC.W $8011,14 ;TYPE SS⓪)DC.B $FE,$FF⓪)DC.W $841B⓪)DC.L 0,0 ;2. Long nur sicherheitshalber wg. Kompat.⓪ Pseudo18 DC.W $8012,10 ;TYPE >signed byte<⓪)DC.B $FE,$FF⓪)DC.W $8527⓪)DC.L 1⓪ Pseudo19 DC.W $8013,10 ;TYPE >strukt. Konst.<⓪)DC.B $FE,$FF⓪)DC.W $842B⓪)DC.L 0⓪ Pseudo20 DC.W $8014,20 ;CONST MaxInt⓪)ASC 'MaxInt'⓪)DC.B $FE,$FF⓪)DC.W $8012,8,2⓪)DC.L $7FFF⓪ Pseudo21 DC.W $8015,12 ;Parameter ABS (Integer): Cardinal;⓪)DC.B $FE,$FF⓪)DC.W $8025,6,7,22⓪ Pseudo22 DC.W $8016,12 ;Parameter ABS (LongInt): LongCard;⓪)DC.B $FE,$FF⓪)DC.W $8025,1,3,58⓪ Pseudo23 DC.W $8017,12 ;Procedure ORD⓪)ASC 'ORD'⓪)DC.B $FF⓪)DC.W $8024,2,24⓪ Pseudo24 DC.W $8018,12 ;Parameter ORD (anyThing): Cardinal;⓪)DC.B $FE,$FF⓪)DC.W $8025,0,7,00⓪ Pseudo25 DC.W $8019,14 ;Procedure HIGH⓪)ASC 'HIGH'⓪)DC.B $FE,$FF⓪)DC.W $8024,3,26⓪ Pseudo26 DC.W $801A,12 ;Parameter HIGH (anyThing): Cardinal;⓪)DC.B $FE,$FF⓪)DC.W $8025,0,7,00⓪ Pseudo27 DC.W $001B,10 ;WORD anonym⓪)DC.B $FE,$FF⓪)DC.W $8515⓪)DC.L 2⓪ Pseudo28 DC.W $001C,10 ;LONG anonym⓪)DC.B $FE,$FF⓪)DC.W $851A⓪)DC.L 4⓪ Pseudo29 DC.W $001D,10 ;BYTE anonym⓪)DC.B $FE,$FF⓪)DC.W $8526⓪)DC.L 1⓪ Pseudo30 DC.W $801E,14 ;Procedure LONG⓪)ASC 'LONG'⓪)DC.B $FE,$FF⓪)DC.W $8024,4,31⓪ Pseudo31 DC.W $801F,12 ;Parameter LONG (Cardinal): LONGCARD;⓪)DC.B $FE,$FF⓪)DC.W $8025,7,3,32⓪ Pseudo32 DC.W $8020,12 ;Parameter LONG (Integer): LONGINT;⓪)DC.B $FE,$FF⓪)DC.W $8025,6,1,33⓪ Pseudo33 DC.W $8021,12 ;Parameter LONG (Word): Long;⓪)DC.B $FE,$FF⓪)DC.W $8025,27,28,34⓪ Pseudo34 DC.W $8022,12 ;Parameter LONG (Byte): Word;⓪)DC.B $FE,$FF⓪)DC.W $8025,29,27,66⓪ Pseudo35 DC.W $8023,14 ;Procedure SHORT⓪)ASC 'SHORT'⓪)DC.B $FF⓪)DC.W $8024,5,36⓪ Pseudo36 DC.W $8024,12 ;Parameter SHORT (LongCard): Cardinal;⓪)DC.B $FE,$FF⓪)DC.W $8025,3,7,37⓪ Pseudo37 DC.W $8025,12 ;Parameter SHORT (LongInt): Integer;⓪)DC.B $FE,$FF⓪)DC.W $8025,1,6,38⓪ Pseudo38 DC.W $8026,12 ;Parameter SHORT (Long): Word;⓪)DC.B $FE,$FF⓪)DC.W $8025,28,27,39⓪ Pseudo39 DC.W $8027,12 ;Parameter SHORT (Word): Byte;⓪)DC.B $FE,$FF⓪)DC.W $8025,27,29,65⓪ Pseudo40 DC.W $8028,12 ;Procedure ODD⓪)ASC 'ODD'⓪)DC.B $FF⓪)DC.W $8024,6,41⓪ Pseudo41 DC.W $8029,12 ;Parameter ODD (anyScalar): Boolean;⓪)DC.B $FE,$FF⓪)DC.W $8025,0,5,0⓪ Pseudo42 DC.W $802A,12 ;Procedure INC⓪)ASC 'INC'⓪)DC.B $FF⓪)DC.W $8024,20,00⓪ Pseudo43 DC.W $802B,12 ;Procedure DEC⓪)ASC 'DEC'⓪)DC.B $FF⓪)DC.W $8024,21,00⓪ Pseudo44 DC.W $802C,12 ;Procedure NEW⓪)ASC 'NEW'⓪)DC.B $FF⓪)DC.W $8024,22,00⓪ Pseudo45 DC.W $802D,16 ;Procedure DISPOSE⓪)ASC 'DISPOSE'⓪)DC.B $FF⓪)DC.W $8024,23,00⓪ Pseudo46 DC.W $802E,14 ;Procedure INCL⓪)ASC 'INCL'⓪)DC.B $FE,$FF⓪)DC.W $8024,24,00⓪ Pseudo47 DC.W $802F,14 ;Procedure EXCL⓪)ASC 'EXCL'⓪)DC.B $FE,$FF⓪)DC.W $8024,25,00⓪ Pseudo48 DC.W $0030,12 ;ADDRESS anonym⓪)DC.B $FE,$FF⓪)DC.W $8517 ;eigener Code, aber Struktur wie Pointer!⓪)DC.L 4⓪)DC.W 27⓪ Pseudo49 DC.W $8031,16 ;CONST nil⓪)ASC 'NIL'⓪)DC.B $FF⓪)DC.W $8012,48,4⓪)DC.L 0⓪ Pseudo50 DC.W $8032,18 ;CONST true⓪)ASC 'TRUE'⓪)DC.B $FE,$FF⓪)DC.W $8012,5,2⓪)DC.L 1⓪ Pseudo51 DC.W $8033,18 ;CONST false⓪)ASC 'FALSE'⓪)DC.B $FF⓪)DC.W $8012,5,2⓪)DC.L 0⓪ Pseudo52 DC.W $8034,12 ;Procedure MIN⓪)ASC 'MIN'⓪)DC.B $FF⓪)DC.W $8024,7,00⓪ Pseudo53 DC.W $8035,12 ;Procedure MAX⓪)ASC 'MAX'⓪)DC.B $FF⓪)DC.W $8024,8,00⓪ Pseudo54 DC.W $8036,14 ;Procedure SIZE⓪)ASC 'SIZE'⓪)DC.B $FE,$FF⓪)DC.W $8024,11,8⓪ Pseudo55 DC.W $8037,12 ;Parameter SIZE (anyThing): LongCard⓪)DC.B $FE,$FF⓪)DC.W $8025,0,3,0⓪ Pseudo56 DC.W $8038,12 ;Procedure VAL⓪)ASC 'VAL'⓪)DC.B $FF⓪)DC.W $8024,9,0 ;keine Parameter/Result-Beschreibung!⓪ Pseudo57 DC.W $8039,16 ;Procedure LENGTH⓪)ASC 'LENGTH'⓪)DC.B $FE,$FF⓪)DC.W $8024,10,0 ;keine Parameter/Result-Beschreibung!⓪ Pseudo58 DC.W $803A,12 ;Parameter ABS (Real): Real;⓪)DC.B $FE,$FF⓪)DC.W $8025,2,2,0⓪ Pseudo59 DC.W $803B,12 ;Procedure INT⓪)ASC 'INT'⓪)DC.B $FF⓪)DC.W $8024,12,0 ;keine Parameter/Result-Beschreibung!⓪ Pseudo60 DC.W $803C,12 ;Procedure CAP⓪)ASC 'CAP'⓪)DC.B $FF⓪)DC.W $8024,13,0 ;keine Parameter/Result-Beschreibung!⓪ Pseudo61 DC.W $803D,12 ;Procedure CHR⓪)ASC 'CHR'⓪)DC.B $FF⓪)DC.W $8024,14,0 ;keine Parameter/Result-Beschreibung!⓪ Pseudo62 DC.W $803E,14 ;Procedure FLOAT⓪)ASC 'FLOAT'⓪)DC.B $FF⓪)DC.W $8024,15,0 ;keine Parameter/Result-Beschreibung!⓪ Pseudo63 DC.W $803F,16 ;Procedure LFLOAT⓪)ASC 'LFLOAT'⓪)DC.B $FE,$FF⓪)DC.W $8024,16,0 ;keine Parameter/Result-Beschreibung!⓪ Pseudo64 DC.W $8040,14 ;Procedure TRUNC⓪)ASC 'TRUNC'⓪)DC.B $FF⓪)DC.W $8024,17,0 ;keine Parameter/Result-Beschreibung!⓪ Pseudo65 DC.W $8041,12 ;Parameter SHORT (LONGREAL): REAL;⓪)DC.B $FE,$FF⓪)DC.W $8025,2,13,69⓪ Pseudo66 DC.W $8042,12 ;Parameter LONG (REAL): LONGREAL;⓪)DC.B $FE,$FF⓪)DC.W $8025,13,2,68⓪ Pseudo67 DC.W $8043,12 ;Parameter SHORT (INTEGER): Byte;⓪)DC.B $FE,$FF⓪)DC.W $8025,6,29,71⓪ Pseudo68 DC.W $8044,12 ;Parameter LONG (SBothTyp): BothTyp;⓪)DC.B $FE,$FF⓪)DC.W $8025,8,9,0⓪ Pseudo69 DC.W $8045,12 ;Parameter SHORT (BothTyp): SBothTyp;⓪)DC.B $FE,$FF⓪)DC.W $8025,9,8,70⓪ Pseudo70 DC.W $8046,12 ;Parameter SHORT (SBothTyp): Byte;⓪)DC.B $FE,$FF⓪)DC.W $8025,9,29,67⓪ Pseudo71 DC.W $8047,12 ;Parameter SHORT (CARDINAL): Byte;⓪)DC.B $FE,$FF⓪)DC.W $8025,7,29,0⓪ (*$? NOT BITSETfromSYSTEM:⓪ Pseudo72 DC.W $8048,20 ;Subrange CARDINAL[0..15] f. BITSET⓪)DC.B $FE,$FF⓪)DC.W $850B⓪)DC.L 2,0,15 ;Size=2, Low=0, Hi=15⓪)DC.W 7 ;Base Type: CARDINAL⓪ *)⓪ (*$? BITSETfromSYSTEM:⓪ Pseudo72 DC.W $0048,6 ;nur dummy⓪)DC.B $FE,$FF⓪)DC.W $803F⓪ *)⓪ Pseudo73 DC.W $8049,20 ;CONST MinInt⓪)ASC 'MinInt'⓪)DC.B $FE,$FF⓪)DC.W $8012,6,2⓪)DC.L $FFFF8000⓪ Pseudo74 DC.W $804A,20 ;CONST MaxCard⓪)ASC 'MaxCard'⓪)DC.B $FF⓪)DC.W $8012,7,2⓪)DC.L $FFFF⓪ Pseudo75 DC.W $804B,20 ;CONST MaxLInt⓪)ASC 'MaxLInt'⓪)DC.B $FF⓪)DC.W $8012,9,4⓪)DC.L $7FFFFFFF⓪ Pseudo76 DC.W $804C,20 ;CONST MinLInt⓪)ASC 'MinLInt'⓪)DC.B $FF⓪)DC.W $8012,1,4⓪)DC.L $80000000⓪ Pseudo77 DC.W $804D,22 ;CONST MaxLCard⓪)ASC 'MaxLCard'⓪)DC.B $FE,$FF⓪)DC.W $8012,3,4⓪)DC.L $FFFFFFFF⓪ Pseudo78 DC.W $804E,12 ;Procedure ABS⓪)ASC 'ABS'⓪)DC.B $FF⓪)DC.W $8024,1,21⓪)⓪)DC.W 0⓪ END⓪ END Pseudo;⓪ ⓪ (*⓪ * ----------------------------------⓪ * System-Modul mit StandardTypen und -Prozeduren⓪ * ----------------------------------⓪ *)⓪ PROCEDURE SysMod;⓪ BEGIN⓪ ASSEMBLER⓪ ⓪ System0 DC.B 6,3 ;Dlayout⓪)DC.W 1 ;Qualified-Flag (NICHT pervasive!)⓪)DC.L SystemKey ;Key⓪(;DC.L System1-System0 ;^ExportListe⓪)DC.L 58⓪)DC.W SystemLen ;Anzahl def. Items⓪(;DC.L SystemI-System0 ;^ImportListe⓪)DC.L 34⓪)DC.L 0 ;Platz fuer definierte Var.⓪)DC.L 0 ;^Modulname⓪(;DC.W SystemI-System0⓪)DC.W 34 ;Headerlänge⓪)DC.W 0 ;^Sourcename⓪)DC.L 0 ;^Liste d. implizit zu importierenden Module⓪ SystemI DC.L PseudoKey ;Import aus Pseudo⓪)DC.W PseudoLen ;Anzahl Items in Pseudo⓪)DC.W 3 ;LongCard importieren⓪)DC.W 10 ;eigene ItemNr⓪)DC.W 11 ;PROC importieren⓪)DC.W 15 ;eigene ItemNr⓪)DC.W 8 ;ShortBothTyp importieren⓪)DC.W 24 ;eigene ItemNr⓪)DC.W 0⓪)DC.L 0 ;Ende der Importliste⓪ System1 DC.W $8001,14 ;TYPE Word⓪)ASC 'WORD'⓪)DC.B $FE,$FF⓪)DC.W $8515⓪)DC.L 2⓪ System2 DC.W $8002,18 ;TYPE Address⓪)ASC 'ADDRESS'⓪)DC.B $FF⓪)DC.W $8517 ;eigener Code, aber Struktur wie Pointer!⓪)DC.L 4⓪)DC.W 1 ;Pointer to Word⓪ System3 DC.W $8003,18 ;TYPE LongWord⓪)ASC 'LONGWORD'⓪)DC.B $FE,$FF⓪)DC.W $851A⓪)DC.L 4⓪ System4 DC.W $8004,14 ;TYPE Byte⓪)ASC 'BYTE'⓪)DC.B $FE,$FF⓪)DC.W $8526⓪)DC.L 1⓪ System5 DC.W $8005,12 ;Procedure ADR⓪)ASC 'ADR'⓪)DC.B $FF⓪)DC.W $8024,101,6⓪ System6 DC.W $8006,12 ;Parameter ADR (anyThing): Address⓪)DC.B $FE,$FF⓪)DC.W $8025,0,2,0⓪ System7 DC.W $8007,14 ;Procedure TSIZE⓪)ASC 'TSIZE'⓪)DC.B $FF⓪)DC.W $8024,103,8⓪ System8 DC.W $8008,12 ;Parameter TSIZE (anyThing): LongCard⓪)DC.B $FE,$FF⓪)DC.W $8025,0,10,0⓪ System9 DC.W $8009,14 ;Procedure CAST⓪)ASC 'CAST'⓪)DC.B $FE,$FF⓪)DC.W $8024,104,0 ;keine Parameter/Result-Beschreibung!⓪ System10 DC.W $000A,10 ;anonyme Beschreibung fuer LongCard⓪)DC.B $FE,$FF⓪)DC.W $8516⓪)DC.L 4⓪ System11 DC.W $800B,20 ;Procedure NEWPROCESS⓪)ASC 'NEWPROCESS'⓪)DC.B $FE,$FF⓪)DC.W $8024,120,16 ;Parameter: ^^PROC⓪ System12 DC.W $800C,18 ;Procedure TRANSFER⓪)ASC 'TRANSFER'⓪)DC.B $FE,$FF⓪)DC.W $8024,121,14 ;Parameter: ^^Address fuer Prozess-Angabe⓪ System13 DC.W $800D,20 ;Procedure IOTRANSFER⓪)ASC 'IOTRANSFER'⓪)DC.B $FE,$FF⓪)DC.W $8024,122,14 ;Parameter: ^^Address fuer Vektor-Angabe⓪ System14 DC.W $800E,12 ;Parameter NEWPROCESS (...ADDRESS...)⓪)DC.B $FE,$FF ;gleichz. TRANSFER, IOTRANSFER, IOCALL (ADDRESS)⓪)DC.W $8025,2,0,0⓪ System15 DC.W $000F,14 ;anonyme Beschreibung fuer TYPE Proc⓪)DC.B $FE,$FF⓪)DC.W $8413⓪)DC.L 4⓪)DC.W 0,0⓪ System16 DC.W $8010,12 ;Parameter NEWPROCESS (PROC ...)⓪)DC.B $FE,$FF⓪)DC.W $8025,15,0,14⓪ System17 DC.W $8011,16 ;Procedure LISTEN⓪)ASC 'LISTEN'⓪)DC.B $FE,$FF⓪)DC.W $8024,123,0 ;keine Parameter⓪ System18 DC.W $8012,16 ;Procedure IOCALL⓪)ASC 'IOCALL'⓪)DC.B $FE,$FF⓪)DC.W $8024,124,14 ;Parameter: address⓪ System19 DC.W $8013,12 ;TYPE LOC⓪)ASC 'LOC'⓪)DC.B $FF⓪)DC.W $8526 ;ItemNo: 38, wie bei BYTE⓪)DC.L 1⓪ System20 DC.W $8014,14 ;Procedure CADR⓪)ASC 'CADR'⓪)DC.B $FE,$FF⓪)DC.W $8024,105,6⓪ System21 DC.W $8015,14 ;Procedure DEREF⓪)ASC 'DEREF'⓪)DC.B $FF⓪)DC.W $8024,106,0 ;keine Parameter!!!???⓪ System22 DC.W $8016,28 ;CONST CompilerVersion⓪)ASC 'CompilerVersion'⓪)DC.B $FF⓪)DC.W $8012,24,2⓪)DC.L CompilerVersion⓪ System23 DC.W $8017,32 ;CONST CompilerSubVersion⓪)ASC 'CompilerSubVersion'⓪)DC.B $FE,$FF⓪)DC.W $8012,24,2⓪)DC.L CompilerSubVersion⓪ System24 DC.W $0018,10 ;anonyme Beschreibung fuer ShortBothTyp⓪)DC.B $FE,$FF⓪)DC.W $8523⓪)DC.L 2⓪ System25 DC.W $8019,16 ;TYPE BITNUM⓪)ASC 'BITNUM'⓪)DC.B $FE,$FF⓪)DC.W $8529 ;ItemNo: 41⓪)DC.L 2⓪ System26 DC.W $801A,14 ;Procedure SHIFT⓪)ASC 'SHIFT'⓪)DC.B $FF⓪)DC.W $8024,107,0 ;keine Parameter!!!???⓪ System27 DC.W $801B,16 ;Procedure ROTATE⓪)ASC 'ROTATE'⓪)DC.B $FE,$FF⓪)DC.W $8024,108,0 ;keine Parameter!!!???⓪ System28 DC.W $801C,18 ;ASSEMBLER-Identifier⓪)ASC 'ASSEMBLER'⓪)DC.B $FF⓪)DC.W $8024,125,0⓪ System29 DC.W $801D,16 ;Function/Procedure CALLSYS⓪)ASC 'CALLSYS'⓪)DC.B $FF⓪)DC.W $8024,126,35 ;1. Parameter: CARDINAL⓪ System30 DC.W $801E,16 ;Function/Procedure CALLEXT⓪)ASC 'CALLEXT'⓪)DC.B $FF⓪)DC.W $8024,127,36 ;1. Parameter: ADDRESS⓪ System31 DC.W $801F,14 ;Procedure CODE⓪)ASC 'CODE'⓪)DC.B $FE,$FF⓪)DC.W $8024,128,0 ;keine Parameter⓪ System32 DC.W $8020,14 ;Procedure LOAD⓪)ASC 'LOAD'⓪)DC.B $FE,$FF⓪)DC.W $8024,129,0 ;keine Parameter⓪ System33 DC.W $8021,14 ;Procedure STORE⓪)ASC 'STORE'⓪)DC.B $FF⓪)DC.W $8024,130,0 ;keine Parameter⓪ Pseudo34 DC.W $8022,20 ;Subrange [0..15] f. CALLSYS-TRAP-Nr.⓪)DC.B $FE,$FF⓪)DC.W $850B⓪)DC.L 2,0,15 ;Size=2, Low=0, Hi=15⓪)DC.W 24 ;Base Type: BothTyp⓪ System35 DC.W $8023,12 ;Parameter CALLSYS ([0..15]...): LONGWORD⓪)DC.B $FE,$FF⓪)DC.W $8025,34,3,0⓪ System36 DC.W $8024,12 ;Parameter CALLEXT (ADDRESS...): LONGWORD⓪)DC.B $FE,$FF⓪)DC.W $8025,2,3,0⓪ (*$? BITSETfromSYSTEM:⓪ System37 DC.W $8025,20 ;Subrange BITNUM[0..15] f. BITSET⓪)DC.B $FE,$FF⓪)DC.W $850B⓪)DC.L 2,0,15 ;Size=2, Low=0, Hi=15⓪)DC.W 25 ;Base Type: BITNUM⓪ System38 DC.W $8026,18 ;TYPE BitSet⓪)ASC 'BITSET'⓪)DC.B $FE,$FF⓪)DC.W $842D⓪)DC.L 2⓪)DC.W 37⓪ *)⓪ (*$? NOT BITSETfromSYSTEM:⓪ System37 DC.W $8025,6 ;nur dummy⓪)DC.B $FE,$FF⓪)DC.W $803F⓪ System38 DC.W $8026,6 ;nur dummy⓪)DC.B $FE,$FF⓪)DC.W $803F⓪ *)⓪)DC.W 0⓪ END⓪ END SysMod;⓪ ⓪ PROCEDURE SysModEnd; END SysModEnd;⓪ ⓪ (* EOT *)⓪ ə
- (* $0000A355$0000985C$00011D46$FFE56852$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$00010848$FFE39FFA$00018B3F$FFE39FFA$0001085C$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$000045B4$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFA$FFE39FFAÇ$00010845T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$FFE30C01$00003736$FFE30C01$0000DC02$0000DC0F$0000DC4D$0000DC60$000108FF$00000038$0000DC50$00010893$00010845$00010A3D$00003718$00003781$000037B2ãÇâ*)
-